javascript - 对列中对象的多维数组进行排序
问题描述
我似乎无法弄清楚。
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] 中的项目?
任何帮助深表感谢!
解决方案
这是一种首先计算对象排序顺序的方法。
然后使用该排序顺序以相同的方式对每一行进行排序。
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))
推荐阅读
- javascript - Transform an array into a string with adding numbers of each element of an array?
- sql - 使用不同的日期集在 SQL 中查找计数
- swift - EKCalendar 显示 Apple 日历中没有的事件“以自然语言发现”
- laravel - SQLSTATE[HY000]:一般错误:1364 字段“album_id”没有默认值
- unit-testing - Spring Boot MockMVC Unit Testing | application/xml;charset=ISO-8859-1
- firefox-addon - 非模态弹出
- javascript - 创建网络地图应用程序。传单还是 OpenLayers?
- oracle - 无需完全扫描即可知道何时在 Oracle 中更新了表
- azure - How to get the webchat bot secret keys?
- github - 如何使用 java 列出 GitHub 存储库的文件夹及其内容?