在javascript中同时在两个数组上循环

在javascript中同时在两个数组上循环,javascript,arrays,foreach,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'}] 我发现这种方法在迭代大型数组时效率不高,是否有任何逻辑、任何内置javascript运算符可以实现同样的效果?首先将第一个数组变成一个由id索引的对象,这样您就可以在O

理想的结果是

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'}]

我发现这种方法在迭代大型数组时效率不高,是否有任何逻辑、任何内置javascript运算符可以实现同样的效果?

首先将第一个数组变成一个由
id
索引的对象,这样您就可以在
O(1)
时间内查找适当的匹配对象,然后您可以
.map
选择的
列表

     let parsedArray = [];
      masterList.forEach(mItem => {
            selectedList.forEach(sItem => {
                if (mItem.id === sItem) {
                    parsedArray.push(mItem);
                }
            });
        });
     desiredList=parsedArray
const masterList=[{id:1,名称:'Abc'},{id:2,名称:'Def'},{id:3,名称:'Ghi'}];
const selectedList=[2,3];
const masterById=主列表.reduce((a,obj)=>{
a[obj.id]=obj;
返回a;
}, {});
const desiredList=selectedList.map(id=>masterById[id]);

console.log(desiredList)它应该是
主列表
上的一个简单的
过滤器

     let parsedArray = [];
      masterList.forEach(mItem => {
            selectedList.forEach(sItem => {
                if (mItem.id === sItem) {
                    parsedArray.push(mItem);
                }
            });
        });
     desiredList=parsedArray

您可以先将
selectedList
转换为
Set
,然后使用
filter()
方法数组对象

您可以使用
Set.prototype.has
检查集合中是否存在对象的
id
。该方法具有O(1)时间复杂度。因此,整个算法的时间复杂度将是线性的

let masterList=[{id:1,名称:'Abc'},{id:2,名称:'Def'},{id:3,名称:'Ghi'}];
让selectedList=[2,3];
设置=新设置(selectedList);
设res=masterList.filter(x=>set.has(x.id));

log(res)
您可以使用Array
filter()
来执行此操作

演示:

let masterList=[{id:1,名称:'Abc'},{id:2,名称:'Def'},{id:3,名称:'Ghi'}];
让selectedList=[2,3];
让desiredList=masterList.filter((val)=>selectedList.includes(val.id));
console.log(desiredList)
尝试以下操作:

let masterList=[{id:1,名称:'Abc'},{id:2,名称:'Def'},{id:3,名称:'Ghi'}];
让selectedList=[2,3];
const result=masterList.filter(({id})=>selectedList.includes(id));

控制台日志(结果)
您可以使用
id
作为键的
映射
,对象作为值,并通过映射
selectedList
从映射中映射所需的值

这种方法使用
selectedList
中的顺序

var masterList=[{id:1,名称:'Abc'},{id:2,名称:'Def'},{id:3,名称:'Ghi'}],
selectedList=[2,3],
结果=selectedList.map(map.prototype.get,新的map(masterList.map(o=>[o.id,o]));

控制台日志(结果)在这种情况下,大数组有多大?您希望代码更短/更简单,还是希望有一个单循环而不是嵌套循环?顺序重要吗?@MaheerAli我想说,有一个更简单的代码和一个简单的循环是一个双赢的局面。但是,我主要希望代码更快、更高效。50不足以让人担心性能优化。除非你有明确的数字,否则我会把重点放在使查找可读性上,measure.OP说:“我发现在迭代大型数组时,这种方法效率不高。”。我认为这个OP意味着他想要一个关于时间复杂性的更好的解决方案。我猜他不想要短代码。在OP定义了什么是大代码以及他们想要什么样的时间之前,很难对性能进行评论。然而,OP确实要求natvie方法来完成他们正在做的事情。