Двумерный массив не сортируется - PullRequest
0 голосов
/ 14 февраля 2019

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

[
  ["A","B","C","D"],
  ["E","F","G","H"],
  [6,43,2,4]
]

Я хочу отсортировать этот массив в порядке убывания элементов в третьей строке, чтобы он выглядел следующим образом:

[
  ["B","A","D","C"],
  ["F","E","H","G"],
  [43,6,4,2]
]

Пока это то, что я написал:

var arr = [
  ["A","B","C","D"],
  ["E","F","G","H"],
  [6,43,2,4]
]

arr = arr.sort((a,b) => {
  return b[2] - a[2]
});

console.log(arr);

Но массив не сортируется.Где я ошибся?

Ответы [ 4 ]

0 голосов
/ 14 февраля 2019

Было бы проще, если бы вы могли изобразить данные по-другому.Функция Array.sort не поможет вам с вашим текущим примером.

var arr = [{
    a: "A", b: "E", c: 6
},{
    a: "B", b: "F", c: 43
},{
    a: "C", b: "G", c: 2
},{
    a: "D", b: "H", c: 4
}]

arr.sort((a, b) => {
    return b.c - a.c;
})

console.log(arr);

Если вы не можете, я мог бы дать другой ответ;но ответ был бы очень неэффективным.

0 голосов
/ 14 февраля 2019

Сначала необходимо отсортировать индексы хранилища номеров, а затем отсортировать другие массивы.

var arr = [
  ["A","B","C","D"],
  ["E","F","G","H"],
  [6,43,2,4]
]

var tmp = arr[2].map((value, i) => ({value, i})).sort((a, b) => b.value - a.value);

arr = arr.map(function(arr) {
  return tmp.map(({value, i}) => arr[i]);
});

console.log(arr);
0 голосов
/ 14 февраля 2019

Вы хотите отсортировать столбцы.Проще сортировать строки.Таким образом, вы можете транспонировать , а затем сортировать и ретранслировать:

const arr = [
  ["A","B","C","D"],
  ["E","F","G","H"],
  [6,43,2,4]
];

const transpose = array => array[0].map((col, i) => array.map(row => row[i]));

const t = transpose(arr);
t.sort((rowi,rowj) => (rowj[rowj.length - 1] - rowi[rowi.length-1]));
console.log(transpose(t));

, который имеет ожидаемый результат:

[ [ 'B', 'A', 'D', 'C' ],
  [ 'F', 'E', 'H', 'G' ],
  [ 43, 6, 4, 2 ] ]

Это явно не так эффективно, как другиеответы, но тот факт, что вы задаете вопрос, предполагает, что ваш текущий способ хранения данных не подходит для ваших целей.Возможно, вы захотите транспонировать, а затем пропустить ретранслируемую часть.

0 голосов
/ 14 февраля 2019

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

var array = [["A", "B", "C", "D"], ["E", "F", "G", "H"], [6, 43, 2, 4]],
    indices = [...array[2].keys()].sort((a, b) => array[2][b] - array[2][a]);

array = array.map(a => indices.map(i => a[i]));

console.log(array.map(a => a.join(' ')));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...