我有一个看起来像这样的数组:
[
["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);
但是数组未排序。我哪里出错了?
答案 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);
如果不能,我可以提供其他答案;但是答案将非常低效。