如何对比整数数组与对象数组,返回匹配及不匹配的ID集合?
按typeID匹配拆分对象数组的ID集合
刚好碰到过类似的需求,我来给你捋捋怎么实现:
首先先明确我们的输入数据:
var arrayOfObjs = [ { id: "d8eed6df-9f12-47d4-5b71-3352a92ebcf0", typeID: 2 }, { id: "270d8355-d8b6-49c4-48ac-97a44422c705", typeID: 3 }, { id: "sdks7878-d8b6-49c4-48ac-97a44422c705", typeID: 4 } ]; var arrayOfInts = [2, 4];
要得到匹配的matchingIDs和不匹配的missingIDs,最高效的方式是先把整数数组转成Set(因为Set的查找是O(1),比数组的includes快很多,数据量大的时候差别明显),然后遍历对象数组做判断:
// 把整数数组转成Set,优化查找性能 const typeIdSet = new Set(arrayOfInts); // 初始化两个结果数组 const matchingIDs = []; const missingIDs = []; // 遍历对象数组 arrayOfObjs.forEach(obj => { if (typeIdSet.has(obj.typeID)) { matchingIDs.push(obj.id); } else { missingIDs.push(obj.id); } }); // 输出结果 console.log(matchingIDs); // ["d8eed6df-9f12-47d4-5b71-3352a92ebcf0", "sdks7878-d8b6-49c4-48ac-97a44422c705"] console.log(missingIDs); // ["270d8355-d8b6-49c4-48ac-97a44422c705"]
补充说明
- 为什么用
Set?如果你的arrayOfInts很大,比如有上百个元素,用arrayOfInts.includes(obj.typeID)每次查找都要遍历整个数组,而Set.has()是直接哈希查找,速度快很多。 - 如果只是小数据量,用
includes也能实现,代码可以改成if (arrayOfInts.includes(obj.typeID)),但性能上还是Set更优。 - 这个写法是原地遍历,不会生成额外的中间数组,内存占用也比较低。
内容的提问来源于stack exchange,提问作者webbydevy
相关产品推荐
相关产品推荐

