пользовательская сортировка в javascript

#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}]));