我有两个对象数组,并且它们都具有columnId属性。 我想使第一个对象的数组的顺序与第二个对象的顺序相同。
我已经尝试过了:
filtered = visibleColumns.filter(function(v) {
return filtered.includes(v.colId);
});
其中filtered
是我的结果数组,而visibleColumns
是我需要的顺序数组,但是它不起作用。
数组示例:
filtered = [{
colId:1,
title: 'col1',
size: 10
},
{
colId:2,
title: 'col2',
size: 10
}];
visibleColumns = [{
colId:2,
visible: true
},
{
colId:1,
visible: true
}];
答案 0 :(得分:1)
您可以创建一个Map
对象,该对象将colId
中的每个visibleColumns
映射到数组中的索引。为colId
排序时获取每个filtered
的索引
const filtered = [{ colId: 1, title: "col1", size: 10 }, { colId: 2, title: "col2", size: 10 }],
visibleColumns = [{ colId: 2, visible: true }, { colId: 1, visible: true }];
const order = new Map(visibleColumns.map((o, i) => [o.colId, i]))
filtered.sort((a, b) => order.get(a.colId) - order.get(b.colId))
console.log(filtered)
答案 1 :(得分:1)
您可以创建具有所需顺序的对象,并为未知ID取默认值,以将其排序到底部。
var filtered = [{ colId: 1, title: 'col1', size: 10 }, { colId: 2, title: 'col2', size: 10 }],
visibleColumns = [{ colId: 2, visible: true }, { colId: 1, visible: true }],
order = visibleColumns.reduce((o, { colId }, i) => (o[colId] = i + 1, o), {});
filtered.sort((a, b) => (order[a.colId] || Infinity) - (order[b.colId] || Infinity));
console.log(filtered);
.as-console-wrapper { max-height: 100% !important; top: 0; }