首页 > 解决方案 > 对列中对象的多维数组进行排序

问题描述

我似乎无法弄清楚。

var arr = [
[ {'value': 3, 'id': 'ab'},  {'value': 1, 'id': 'ab'},  {'value': 5, 'id': 'ab'} ],
[ {'value': 6, 'id': 'bc'},  {'value': 3, 'id': 'bc'},  {'value': 4, 'id': 'bc'} ],
[ {'value': 1, 'id': 'cd'},  {'value': 3, 'id': 'cd'},  {'value': 2, 'id': 'de'} ],
]

我有一个数组 arr。arr[0]、arr[1] 和 arr[2] 都包含相同数量的对象。

我想按 arr[1] 对整个数组进行排序。例如

var result = [
[ {'value': 1, 'id': 'ab'},  {'value': 5, 'id': 'ab'}, {'value': 3, 'id': 'ab'}, ],
[ {'value': 3, 'id': 'bc'},  {'value': 4, 'id': 'bc'}, {'value': 6, 'id': 'bc'}, ],
[ {'value': 3, 'id': 'cd'},  {'value': 2, 'id': 'de'}, {'value': 1, 'id': 'cd'}, ],
]

-> arr[1] 现在按“值”(3,4,6) 排序。arr[0] 和 arr[2] 中的相应值也被“排序”了。如果 arr[1][1] 由于 arr[1] 被正确排序而移到开头,则 arr[0][1] 和 arr[2][1] 也会如此。

排序前

3 1 5
6 3 4
1 3 2

排序后

1 5 3 <- 1 is 'linked' to 3 in 2nd row, 5 is 'linked' to 4 in 2nd row, etc.
3 4 6 <- sorted
3 2 1 <- 3 is 'linked' to 3 in 2nd row, 2 is 'linked' to 4 in 2nd row, etc.

例如,我可以使用排序 arr[1]

arr[1].sort(function(a,b) {
    return a.value-b.value
});

但这当然不会像我想的那样改变 arr[0] 和 arr[2] 。显然对于

arr.forEach(item =>
item.sort(function(a,b) {
    return a.value-b.value
}));

它只对每个数组分别进行排序。

是否有可能例如获取 a 和 b 的索引,以便我可以自己移动 arr[0] 和 arr[1] 中的项目?

任何帮助深表感谢!

标签: javascriptsortingjavascript-objects

解决方案


这是一种首先计算对象排序顺序的方法。
然后使用该排序顺序以相同的方式对每一行进行排序。

var arr = [
  [ {'value': 3, 'id': 'ab'}, {'value': 1, 'id': 'ab'}, {'value': 5, 'id': 'ab'} ],
  [ {'value': 6, 'id': 'bc'}, {'value': 3, 'id': 'bc'}, {'value': 4, 'id': 'bc'} ], 
  [ {'value': 1, 'id': 'cd'}, {'value': 3, 'id': 'cd'}, {'value': 2, 'id': 'de'} ]
];

function sortArrayColumnsByIndex(arr2dOfObj, rowindex, objkey) {
    let rownum = rowindex || 0;
    let key = objkey || Object.keys(arr2dOfObj[0][0])[0];
    let sortorder = arr2dOfObj[rownum]
         .map((x,i)=>[x,i])
         .sort((a, b) => a[0][key] < b[0][key] ? -1 : a[0][key] > b[0][key] ? 1 : 0) 
         .map(x=>x[1]);

    arr2dOfObj.forEach( 
       (row, idx) => {
       let sorted = [];
       sortorder.forEach( (y) => {
         sorted.push(row[y]);
       })
       arr2dOfObj[idx] = sorted;
      }
  );
}

sortArrayColumnsByIndex(arr, 1, 'value');

console.log(JSON.stringify(arr))


推荐阅读