array.sort(function() { return Math.random() - 0.5 })
Вроде бы все правильно. Массив должен сортироваться случайным образом. Но это не совсем так. Иногда такой способ вызывает исключение «нарушены условия контракта».
Разбираемся в причинах.
Оказывается сортировка вызывается неоднократно и для одних и тех же пар элементов будут разные значения сортировки. Это может привести к повторным перемещениям элементов в списке сортировки. Естественно это сделает сортировку более длительной. Скорее всего внутри сортировщика находится защита от длительной сортировки. Вот мы и получаем такое исключение.
Как стоит производить сортировку?
Метод следующий. Сразу генерим массив случайных чисел рядом и сортируем свой массив как этот сгенерированый. Код реализации такой.
array .map(function(elem,index) { return [elem, Math.random()]}) .sort(function(a,b){ return a[1] - b[1]}) .map(function(elem){return elem[0]})
ссылка на оригинал статьи https://habr.com/ru/post/463501/
Добавить комментарий