#javascript #sorting
#javascript #сортировка
Вопрос:
Я пытаюсь реализовать пользовательскую sort
функцию. У меня есть эти правила:
['B', 'A'] => will become ['A', 'B']
['2', '1'] => will become ['1', '2']
['Down', 'Up'] => will become ['Up', 'Down']
Итак, если есть числа или строки, я хочу отсортировать их в порядке возрастания, но если у меня есть ключевые слова Up/Down
, я хочу Up
сначала, затем Down
.
Вот что я пробовал до сих пор:
let c = [
{
pos: 'Down',
},
{
pos: 'Up',
},
];
c.sort(function (a, b) {
console.log(a.pos) // why is this 'Up' and not 'Down'?
if (a.pos === 'Down' amp;amp; b.pos === 'Up') {
console.log('enter on 1');
return 1;
} else {
if (a.pos > b.pos) {
console.log('enter on 2');
return 1;
}
}
console.log('enter on 3');
return -1;
});
console.log(c); // expected result [{pos: 'Up'}, {'pos': 'Down'}]
Я ожидал, что мой код enter on 1
но вместо этого он вводится enter on 2
. Так почему, если я console.log(a.pos)
получаю Up
, а не Down
получаю?
Спасибо за ваше время!
Комментарии:
1. Нет никакой гарантии, как
.sort()
внутренний код будет вызывать ваши функции сравнения. Другими словами,a
иb
не обязательно являются первым и вторым элементами массива.2. Все, что вы знаете, это то, что
a
иb
— это два элемента откуда-то из массива.3. Итак, просто проверьте, является ли [0] == «Down»? В таком случае: поменять местами. Использование
.sort()
для пары может быть чрезмерным, когда у вас есть такие особые правила.4. @Tenzolinho Если есть только 2 значения и у вас есть определенный набор правил, вам может не понадобиться
.sort()
здесь. Согласен с комментариями @trincot.5. Кстати, запуск этого скрипта в Firefox дает ожидаемый результат. Который поддерживает слова Пойнти: не ожидайте какого-либо определенного порядка элементов или вызовов в компараторе. Вы получаете два элемента, и вам нужно вернуть ноль, положительное или отрицательное число.
Ответ №1:
function mySort(arr) {
arr.sort(function (a, b) {
a = a.pos;
b = b.pos;
if (a==='up' amp;amp; b==='down')
return -1;
if (b==='up' amp;amp; a==='down')
return 1;
if (!(isNaN(a)))
return a-b;
return a.localeCompare(b);
});
return arr;
}
console.log(mySort([{pos:'Down'}, {pos:'Up'}]));
console.log(mySort([{pos:'B'},{pos:'X'},{pos:'A'}]));
console.log(mySort([{pos:12},{pos:56},{pos:2},{pos:0}]));