JavaScript сортирует массив по нескольким (числовым) полям

Как я могу реализовать

 ORDER BY sort1 DESC, sort2 DESC

логика в массиве JSON такая:

    var items = '[
          {
            "sort1": 1,
            "sort2": 3,
            "name" : "a",
          },
          {
            "sort1": 1,
            "sort2": 2,
            "name" : "b",
          },
          {
            "sort1": 2,
            "sort2": 1,
            "name" : "c",
          }
    ]';

в результате чего в новом порядке:

b,a,c
 coiso03 нояб. 2012 г., 18:44
использую JSON вот так, есть ли лучший способ?
 I Hate Lazy03 нояб. 2012 г., 18:39
Почему вы помещаете свой синтаксис Array в (сломанный) строковый литерал? I '
 I Hate Lazy03 нояб. 2012 г., 18:46
Так как тыперераспределение массиваitems переменная, тыуже в среде JavaScript, так что это неСлишком много смысла сначала представлять его как разметку JSON, а затем анализировать. Если это должно было представлять разметку JSON, отправляемую с сервера, то лучшим представлением будет избавление от лишнейvar items = ...; синтаксис, и просто показать его как разметку с примечанием, объясняющим, что этоВаша разметка на стороне сервера.

Ответы на вопрос(2)

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

function sortByMultipleKey(keys) {
    return function(a, b) {
        if (keys.length == 0) return 0; // force to equal if keys run out
        key = keys[0]; // take out the first key
        if (a[key] < b[key]) return -1; // will be 1 if DESC
        else if (a[key] > b[key]) return 1; // will be -1 if DESC
        else return sortByMultipleKey(keys.slice(1))(a, b);
    }
}

Бег

items.sort(sortByMultipleKey(['sort1', 'sort2']));

будет тебя

[ { sort1: 1, sort2: 2, name: 'b' },
  { sort1: 1, sort2: 3, name: 'a' },
  { sort1: 2, sort2: 1, name: 'c' } ]
 raina77ow22 нояб. 2017 г., 11:40
Извините, но эта реализация обобщенной функции слишком неэффективна. Сомнительно использовать не только рекурсию (вы можете просто перебирать список ключей, пока результаты сравнения не будут отличны от нуля), для каждого 'мисс сравнения там's создан новый экземпляр функции сравнения. Сравните ваш код среализация lodash, например.
Решение Вопроса

Вы должны разработать свою функцию сортировки соответственно:

items.sort(function(a, b) {
  return a.sort1 - b.sort1  ||  a.sort2 - b.sort2;
});

(так как|| оператор имеет более низкий приоритет, чем- один, этонет необходимости использовать круглые скобки здесь).

Логика проста: еслиa.sort1 - b.sort1 Выражение оценивается как 0 (поэтому эти свойства равны), оно продолжит вычислять|| выражение - и вернуть результат.a.sort2 - b.sort2

Как звание, вашitems на самом деле строковый литерал, вы должныJSON.parse чтобы получить массив:

const itemsStr = `[{
    "sort1": 1,
    "sort2": 3,
    "name": "a"
  },
  {
    "sort1": 1,
    "sort2": 2,
    "name": "b"
  },
  {
    "sort1": 2,
    "sort2": 1,
    "name": "c"
  }
]`;
const items = JSON.parse(itemsStr);
items.sort((a, b) => a.sort1 - b.sort1 || a.sort2 - b.sort2);
console.log(items);

 Dogoku24 нояб. 2017 г., 17:26
 xhg22 нояб. 2017 г., 01:28
используя оператор- может вызвать проблемы, так как значение может быть строкой.
 xhg22 нояб. 2017 г., 11:57
Это обсуждение бессмысленно. Название говорит, что этоnumberТогда это должен быть номер. Если это строка, вероятно, вам нужно позаботиться оа» который- победил'т работа. Кстати, localeCompare () удобно.
 xhg22 нояб. 2017 г., 11:39
Тот'именно то, что я говорю. - относится только к номерам. Я не говорю, что вы не правы. Я предоставляю общее решение, как я сказал в своем ответе.
 raina77ow22 нояб. 2017 г., 11:47
Помните, явное лучше, чем неявное. Если вы хотите, чтобы значения сравнивались как строки влюбой случайиспользоватьString.localeCompare () вместо.
 raina77ow22 нояб. 2017 г., 11:42
- only applies to numbers - нет, этонет. '12 '-' 3 ' оценивается до 9 (> 0), поместив бывший операнд выше. '12' < '3' оцениваетtrue, в обратном порядке. ‘
 ozw1z5rd06 мар. 2019 г., 12:36
Большой! Просто, понятно и работает!
 raina77ow22 нояб. 2017 г., 11:35
Я боюсь, что вы упустили момент, как в своем комментарии, так и в своем ответе. С помощью- вместо
 xhg22 нояб. 2017 г., 11:43
12’ должно быть меньше ‘3’.

Ваш ответ на вопрос