如何用JavaScript的.filter方法匹配二维数组首元素与一维数组对应项?
查找数组元素在另一个数组中的对应位置
我有两个数组:
第一个是二维数组:
var arr = [ [1529539200,15.9099,16.15,15.888,16.0773,84805.7,1360522.8], [1529625600,16.0768,17.38,15.865,17.0727,3537945.2,58937516], [1529712000,17.0726,17.25,15.16,15.56,3363347.2,54172164] ];
第二个是一维数组:
var arr2 = [ 1647475200, 1647561600, 1647648000, 1647734400, 1647820800, 1647907200, 1647993600, 1648080000, 1648166400, 1648252800 ];
我需要实现的是:遍历arr中的每个子数组,取其第一个元素(即arr[i][0]),查找该元素在arr2中的位置索引。比如如果arr[100][0]的值存在于arr2中,我需要得到它在arr2里的索引。
我尝试用.filter()方法,但只得到了一个结果,而arr的长度是120,应该得到120个结果,恳请帮忙解决。
解决方案
方法1:直接遍历查找(小数据量适用)
使用Array.prototype.map()遍历arr的每个子数组,对每个子数组的第一个元素调用arr2.indexOf()获取索引,元素不存在时会返回-1。
// 遍历arr,收集每个子数组首元素在arr2中的索引 const result = arr.map(item => arr2.indexOf(item[0])); console.log(result);
方法2:预存映射提升效率(大数据量适用)
如果arr和arr2数据量较大,每次调用indexOf()都会遍历arr2,效率较低。可以先把arr2的元素与索引存成Map,之后直接通过键值对查找,时间复杂度从O(n*m)降至O(n+m)。
// 构建arr2的元素-索引映射表 const valueIndexMap = new Map(); arr2.forEach((val, idx) => valueIndexMap.set(val, idx)); // 遍历arr获取结果,不存在则返回-1 const result = arr.map(item => valueIndexMap.get(item[0]) ?? -1); console.log(result);
为什么你的.filter()方法无效?
.filter()的作用是筛选出符合条件的元素,而不是遍历每个元素并返回对应值。你需要的是遍历每个元素并输出对应结果,因此应该使用.map()方法,而非.filter()。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

