let masterList=[{id:1,name:'Abc'},{id:2,name:'Def'},{id:3,name:'Ghi'}];
let selectedList=[2,3];
期望的结果是
//desiredList=[{id:2,name:'Def'},{id:3,name:'Ghi'}]
目前我在做什么
let parsedArray = [];
masterList.forEach(mItem => {
selectedList.forEach(sItem => {
if (mItem.id === sItem) {
parsedArray.push(mItem);
}
});
});
desiredList=parsedArray
在遍历大型数组时,我发现此方法不高效,是否有任何逻辑,内置的JavaScript运算符可以用来实现相同的效果?
答案 0 :(得分:4)
您可以使用map
作为键的id
,将对象作为值,并通过映射selectedList
从映射中映射所需的值。
此方法使用selectedList
中的顺序。
var masterList = [{ id: 1, name: 'Abc' }, { id: 2, name: 'Def' }, { id: 3, name: 'Ghi' }],
selectedList = [2, 3],
result = selectedList.map(Map.prototype.get, new Map(masterList.map(o => [o.id, o])));
console.log(result);
答案 1 :(得分:3)
在filter
上应该是一个简单的masterList
:
masterList.filter(item => selectedList.includes(item.id));
答案 2 :(得分:3)
您可以使用数组filter()
执行此操作。
演示:
let masterList=[{id:1,name:'Abc'},{id:2,name:'Def'},{id:3,name:'Ghi'}];
let selectedList=[2,3];
let desiredList = masterList.filter((val) => selectedList.includes(val.id));
console.log(desiredList)
答案 3 :(得分:2)
首先将第一个数组转换为由gender()
索引的对象,以便您可以在id
的时间内查找适当的匹配对象,然后可以O(1)
{{1} }:
.map
答案 4 :(得分:2)
您可以先将selectedList
转换为Set
,然后使用filter()
方法的对象数组。
您可以使用Set.prototype.has
来检查集合中是否存在id
个对象。而且该方法具有O(1)时间复杂度。因此,整个算法的时间复杂度将是线性的。
let masterList=[{id:1,name:'Abc'},{id:2,name:'Def'},{id:3,name:'Ghi'}];
let selectedList = [2,3];
let set = new Set(selectedList);
let res = masterList.filter(x => set.has(x.id));
console.log(res)
答案 5 :(得分:2)
尝试一下:
let masterList=[{id:1,name:'Abc'},{id:2,name:'Def'},{id:3,name:'Ghi'}];
let selectedList=[2,3];
const result = masterList.filter(({id})=> selectedList.includes(id));
console.log(result);