二维数组未排序

时间:2019-02-14 16:35:18

标签: javascript arrays sorting

我有一个看起来像这样的数组:

[
  ["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 :(得分:3)

您可以采用数组的索引进行排序,并按照原始数组的值对该数组进行排序,然后映射所有重新排序的项。

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(' ')));

答案 1 :(得分:2)

您需要先对数字存储索引进行排序,然后对其他数组进行排序。

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);

答案 2 :(得分:2)

您要对列进行排序。对行进行排序更容易。因此,您可以transpose然后排序然后重新转置:

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 ] ]

这显然不如其他答案有效,但是您所提问题的事实表明,当前存储数据的方式并不适合您的目的。也许您可能想转置,然后跳过转置部分。

答案 3 :(得分:1)

如果您可以用不同的方式描述数据,那会更容易。 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);

如果不能,我可以提供其他答案;但是答案将非常低效。