如何检查数组arr1的VI_ID是否存在于数组arr2的VILLAGE_ID中
问题:匹配两个对象数组的关联ID并输出对应名称
给定两个对象数组:
var arr1 = [ { VILLAGES_NAME: 'Chozuba Vill.', VI_ID: 269292, VI_SUBDIST_ID: 1806 }, { VILLAGES_NAME: 'Thevopisu', VI_ID: 269381, VI_SUBDIST_ID: 1806 }, { VILLAGES_NAME: 'Chozubasa (UR)', VI_ID: 269293, VI_SUBDIST_ID: 1806 } ]; let arr2 = [ { LOCALITIES_NAME: 'CHOZUBA PART TWO', LOCALITY_ID: 301, VILLAGE_ID: 269292 }, { LOCALITIES_NAME: 'CHOZUBA PART ONE', LOCALITY_ID: 300, VILLAGE_ID: 269292 } ];
需求:遍历arr1,检查每个元素的VI_ID是否与arr2中任意元素的VILLAGE_ID匹配,匹配则输出该元素的VILLAGES_NAME。
现有代码的问题
你尝试的代码无法得到预期结果,原因是:
if(arr2.includes(arr1[i].VI_ID))
arr2是对象数组,includes方法会严格匹配数组中的整个元素(即判断是否有元素完全等于传入的数字),但arr2里的元素都是包含多个属性的对象,所以这个判断永远返回false,自然不会输出任何内容。
两种正确实现方式
方式一:用Set优化查询效率(适合大数据量)
先把arr2中的所有VILLAGE_ID提取到Set集合中,再遍历arr1做匹配:
// 提取arr2中所有VILLAGE_ID到Set const villageIdSet = new Set(arr2.map(item => item.VILLAGE_ID)); // 遍历arr1检查匹配 for (let i = 0; i < arr1.length; i++) { if (villageIdSet.has(arr1[i].VI_ID)) { console.log(arr1[i].VILLAGES_NAME); } }
Set的has方法查询时间复杂度为O(1),比每次遍历arr2效率更高,数据量大时优势明显。
方式二:直接用Array.some方法(适合小数据量)
遍历arr1时,用some方法检查arr2中是否存在匹配的元素:
for (let i = 0; i < arr1.length; i++) { const isMatched = arr2.some(item => item.VILLAGE_ID === arr1[i].VI_ID); if (isMatched) { console.log(arr1[i].VILLAGES_NAME); } }
some方法会在找到第一个匹配元素后立即停止遍历,无需遍历整个arr2。
内容的提问来源于stack exchange,提问作者Abhishek Mishra
相关产品推荐
相关产品推荐

