Как отсортировать 2-х мерный массив по 4-му значению?

1

Я знаю, что ответ на этот вопрос не пропущен, но неся со мной, я пробовал много решений, и мне все еще трудно сортировать двумерный массив по 4-му значению с помощью JavaScript.

Вот как выглядит список (массив может содержать неограниченное количество списков):

colors = [[247, 247, 247, 429, 1], [132, 128, 132, 2, 1], [37, 29, 37, 649, 1]]

выход должен быть:

colors = [[37, 29, 37, 649, 1], [247, 247, 247, 429, 1], [132, 128, 132, 2, 1]]

Вот что я пробовал:

colors.sort(function(a,b){
    alert(a[3] - b[3]);
});

Код выше возвращает, NaN, я не уверен, почему...


Если это может помочь эквивалент python того, чего я пытаюсь достичь, будет:

sorted_colors = sorted(colors(u), key=lambda x: -x[3])
  • 0
    alert - плохой инструмент отладки, лучше используйте console . А поскольку ваша функция сортировки ничего не возвращает, ваш массив вообще не должен сортироваться. Но я не вижу ничего, что напечатало бы NaN в этом коде.
  • 0
    @Thomas Томас Да, я должен был вернуться вместо того, чтобы предупредить об этом, какую любительскую ошибку я совершил ... Ответ был у меня под носом.
Показать ещё 1 комментарий
Теги:
arrays

4 ответа

3

Обратный вызов sort # массива должен возвращать число. Вы не возвращаете результат вычитания, вы просто показываете его с предупреждением. Удалите alert() и верните b[3] - a[3] чтобы получить требуемый заказ.

var colors = [[247, 247, 247, 429, 1], [132, 128, 132, 2, 1], [37, 29, 37, 649, 1]];

colors.sort(function(a,b){
    return b[3] - a[3];
});

console.log(colors);
2

Вы почти там. Вам следует рассмотреть возможность просмотра документов Array # sort(). Это не правильный синтаксис.

colors.sort(function(a,b){
    alert(a[3] - b[3]);
});

Вы должны вернуть результат не оповещения

colors.sort(function(a,b){
    return b[3] - a[3];
});
  • 1
    Плюс OP, кажется, хочет в обратном порядке, поэтому следует использовать b[3] - a[3] .
  • 1
    @ sp00m Да. Исправленный.
2

Поскольку функция в .sort() требует возврата значения. Вы только предупреждаете о значении.

Вот рабочий пример:

var colors = [[247, 247, 247, 429, 1], [132, 128, 132, 2, 1], [37, 29, 37, 649, 1]],
    sorted = colors.sort(function(a, b) { return b[3] - a[3]; }); // DESC
console.log(sorted);
1

Вы не сравниваете, когда вы пишете предупреждение (...), вы должны вернуть результат, используйте это:

colors.sort(function(a,b){
    return b[3] - a[3]; // b - a when you are sorting 9->1, a-b otherwise
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню