我需要通过" ID"来订购一系列对象。属性,数组看起来像这样:
var data = [
{
id: 1,
name: "Test"
},
{
id: 2,
name: "Another test"
},
{
id: 3,
name: "Third test"
}
];
和'排序'数组看起来像这样:
var sortingArray = [2,3,1];
如何通过排序数组对对象数组进行排序?
答案 0 :(得分:0)
您需要一个小功能,例如:
function sortByKey(array, key)
{
return array.sort(function(a, b) {
let x = a[key]; var y = b[key];
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
});
}
并使用它:
let sorted = sortByKey(data, "id");
答案 1 :(得分:0)
json
答案 2 :(得分:0)
您可以使用array#reduce
和array#filter
const data = [{id: 1,name: "Test"},{id: 2,name: "Another test"},{id: 3,name: "Third test"}],
sortingArray = [2,3,1];
var result = sortingArray.reduce((res, n) => {
let temp = data.filter(o => o.id === n);
return res.concat(temp);
},[]);
console.log(result);
&#13;
答案 3 :(得分:0)
当处理这样的列表时,我通常会有一张地图,我可以通过ID获取项目;快速访问。
快速版本将是:
var data = [
{
id: 1,
name: "Test"
},
{
id: 2,
name: "Another test"
},
{
id: 3,
name: "Third test"
}
];
var dataById = data.reduce((acc, item) => (acc[item.id] = item, acc), Object.create(null));
//and now using it
var sortingArray = [2,3,1];
var result = sortingArray.map(id => dataById[id]);
console.log(result);
.as-console-wrapper{top:0;max-height:100%!important}
这方面的缺点是数组和地图需要保持同步。因此,您对Array 所做的每次更新(如添加,删除或替换对象)都需要对地图进行更新。修改对象很好(除非你修改ID,你永远不应该这样做)
如果列表上有很多波动,我会将它包装在一个为我处理此同步的对象中