同时在JavaScript中循环两个数组

时间:2019-07-08 10:16:47

标签: javascript arrays foreach

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运算符可以用来实现相同的效果?

6 个答案:

答案 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);