алгоритм работы метода Array.prototype.sort()

218
26 декабря 2017, 18:38

Метод sort сортирует имеющийся объект Array; нового объекта Array не создается.

Если указать функцию в аргументе sortFunction, она должна возвращать одно из следующих значений:

  • Отрицательное значение, если первый переданный аргумент меньше второго аргумента.
  • Нуль, если аргументы эквивалентны.
  • Положительное значение, если первый аргумент больше второго аргумента.

К примеру есть массив var arr = [2, 8, 5];. Если вызвать метод с 0 и -1 результат будет одинаковым.

var firstArr = [2, 8, 5], 
    secondArr = [2, 8, 5]; 
 
firstArr.sort(function(){ 
  return -1; 
}); 
 
secondArr.sort(function(){ 
  return 0; 
}); 
 
console.log(firstArr, secondArr);

Какая разница между -1 и 0?

Update: Какая практическая необходимость в 0 и -1, если конечный результат ихний говорит о том, что сортировка не требуется. Почему просто не сделать a > b ? 1 : 0? Приведите пожалуйста практический пример, где отсутствие третьего значение (0 или -1) приведет к ошибки в сортировке, что бы можно было понять их практическую принадлежность в работе метода.

Answer 1

Разница между -1 и 0 - один :).

Возвращая -1, Вы говорите, что первый элемент всегда меньше второго. Порядок подачи элементов массива как параметров в функцию sort - очевидно соответствует их относительному положению в массиве. Pезультат - сортировка не требуется.

Возвращая ноль, Вы говорите, что все элементы одинаковые - сортировка не требуется.

Update

А-а-а, может, Вы пока не понимаете, как правильно писать функции sort? У этой функции должно быть два параметра, возвращать значение она должна в зависимости от этих параметров, а вызывается она алгоритмом, когда ему надо сравнить два элемента массива.

var arr1 = [2, 8, 5], 
    arr2 = [2, 8, 5]; 
 
arr1.sort(function(a, b){ 
  return a - b; 
}); 
console.log("ascending:", arr1); 
 
arr2.sort(function(a, b){ 
  return b - a; 
}); 
console.log("descending:", arr2);

Answer 2

Не все браузеры используют устойчивую сортировку(где необходимое условие как раз что а и b могут оставаться неизменными),поэтому при сравнении следует возвращать ноль.Представьте у Вас два элемента и они равны друг другу,как Вы их сравните?В худшем случае получится петля.Поэтому,чтобы везде работало корректно, стоит делать как описано в спецификации.

Попробуйте в Chrome,при последующих сортировках элемент в центре будет перемещаться.

<div id=test>
    <div>B</div>
    <div>D</div>
    <div>A</div>
    <div>C</div>
    <div>E</div>
    <div>B</div>
    <div>D</div>
    <div>A</div>
    <div>C</div>
    <div>E</div>
    <div>B</div>
    <div>D</div>
    <div>A</div>
    <div>C</div>
    <div>E</div>
</div>

JS:

<input type=button value="Sort" onclick="dosort()">
var firsttime = true;
function dosort() {
    var elements = document.getElementById('test').children;
    var sortMe = [];
    for (var i=0; i<elements.length; i++)
        sortMe.push(elements[i]);
    sortMe.sort(function(a, b) {
        if (firsttime) {
            if (a.innerText < b.innerText) return -1;
            if (a.innerText > b.innerText) return 1;
            else return 0;
        } else {
            return 0;
        }
    });
    var parent = document.getElementById('test');
    parent.innerHTML = "";
    for(var i = 0, l = sortMe.length; i < l; i++) {
        parent.appendChild(sortMe[i]);
    }
    firsttime=false;
}

READ ALSO
Вывод элементов массива по порядку при нажатии

Вывод элементов массива по порядку при нажатии

При нажатии на button выводятся все элементы массива:

193
Как сделать несколько линий на одном графике FLOT по данным MySQL?

Как сделать несколько линий на одном графике FLOT по данным MySQL?

Нашла пример http://conovaloffcom/flot Но я беру из БД MySQL по 1 запросу

251
Достать элемент из массива ( после json_decode())

Достать элемент из массива ( после json_decode())

Не выходит достать значение ID из массива,

266
Передача массива между страницами

Передача массива между страницами

Здравствуйте, есть массив чекбоксов $_POST['ch'], переданный на страницу через

263