2016-04-10 2 views
3

У меня возникло странное поведение при попытке сортировать массив JavaScript.Странное поведение при сортировке массива JavaScript

var arr = ['a', 'b', 'C', 'd', 'e', 'f', 'g', 'h', 'I', 'k']; 
 

 
arr.sort(function (a, b) { 
 
    console.log(a, b); 
 
    if (a.length < b.length) return 1; 
 
    else if (a.length > b.length) return -1; 
 
    else return 0; 
 
});

прекрасно работает в этом случае дает мне обратно тот же массив.

консоль выглядит следующим образом,

enter image description here

Но когда я пытаюсь для этого ниже входа,

var arr = ['a', 'b', 'C', 'd', 'e', 'f', 'g', 'h', 'I', 'k', 'l']; 

дает мне это,

enter image description here

я могу Не понимаю, почему это происходит в г.

PS. Я пишу этот пользовательский сортировку, проверяя длину элементов, потому что мне нужен массив, который имеет свои элементы, отсортированные по длине.

+0

попробовать 'Возвращение a.length - b.length' – Isaac

+0

также, все эти длины будут 1 ... попробуйте console.log() некоторые из переменных – Isaac

+0

Это Бесполезный Не работай. Да, я знаю. Все должны быть 1. Следовательно, их следует пропустить и быть такими, какие они есть. Это обрабатывается в возврате else 0; –

ответ

2

ECMAScript не диктует конкретный алгоритм и не ожидает его стабилизации (Array.prototype.sort). Стабильные алгоритмы сортировки поддерживают относительный порядок элементов, которые кажутся «одинаковыми». В Array # sort два элемента отображаются одинаково, когда функция сравнения возвращает 0. В то время как InsertionSort и MergeSort (Apple и Mozilla) стабильны, QuickSort (Google Chrome) не является (проблема 90). Chrome будет сортировать массивы с помощью InsertionSort, если массив имеет 10 или менее элементов.

Таким образом, Safari и Firefox сортируют ["sed", "dolor", "ipsum", "foo", "bar", "cat", "sit", "man", "lorem", "amet", "maecennas"] (по длине символа) таким образом, что «sed» сохранит первое положение, в то время как Chrome перевернет кости и, возможно, предпочтет «кошку» занять поул-позицию. Разработчики Chrome, очевидно, любят котята ...

Таким образом, реализуя стабильный алгоритм, например, MergeSort, если вы в этом нуждаетесь.

проверка полный пост here

+0

Кроме того, возврат '0' из вашего метода сортировки не поддерживается во всех браузерах. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort –

+1

@JeremyJStarcher: Вы неправильно истолковываете документы. Возврат '0' [абсолютно необходим в функции сравнения] (http://stackoverflow.com/q/20883421/1048572), и он поддерживается всеми браузерами. Вещь, которая не поддерживается во всех браузерах, - это только стабильное поведение; они все равно будут сортировать равные вещи рядом друг с другом. – Bergi

Смежные вопросы