如何按索引比较数组并生成适配CSV的含空值新数组
解决方案:嵌套数组与一维数组按值匹配生成对应长度数组
问题分析
你需要将嵌套数组中的每个子数组,与一维数组array1按值匹配索引:子数组中的值如果在array1里存在,就放到结果数组对应array1的索引位置;不存在的位置留空,最终结果数组长度和array1一致,用于CSV表格的空单元格对应。
代码解决方案
方法一:使用Map快速查找(高效)
这种方法通过提前建立array1的值与索引的映射,避免重复遍历查找,适合数据量较大的场景:
const array1 = [1,2,3,4,5,6,7,8,9,10]; const array2 = [[1,2,4,6],[1,3,7,9,10],[1,2],[1,6,8,9]]; // 建立值到索引的映射表 const valueIndexMap = new Map(array1.map((val, idx) => [val, idx])); // 处理每个子数组 const outputtedArray = array2.map(subArr => { // 创建与array1长度一致的数组,初始填充undefined(对应空值) const result = new Array(array1.length).fill(undefined); subArr.forEach(val => { const targetIndex = valueIndexMap.get(val); // 如果值在array1中存在,放入对应索引位置 if (targetIndex !== undefined) { result[targetIndex] = val; } }); return result; }); console.log(outputtedArray);
方法二:直接遍历匹配(直观易懂)
如果数据量不大,这种写法更简洁直观,适合新手理解:
const array1 = [1,2,3,4,5,6,7,8,9,10]; const array2 = [[1,2,4,6],[1,3,7,9,10],[1,2],[1,6,8,9]]; const outputtedArray = array2.map(subArr => { // 遍历array1的每个值,检查子数组是否包含该值 return array1.map(val => subArr.includes(val) ? val : undefined); }); console.log(outputtedArray);
两种方法的输出都符合你的预期:
[ [1,2,,4,,6,,,,,], [1,,3,,,,7,,9,10], [1,2,,,,,,,,,], [1,,,,,6,,8,9,] ]
原代码问题说明
你之前的for循环存在几个问题:
- 仅处理了
array2[0]第一个子数组,没有遍历所有子数组; - 比较逻辑冗余且易出错:
i + array2[0][i] == i + array1[i]本质是判断值相等,但这种写法完全没必要; - 每次循环创建新数组
const arrays =[],没有累积结果,所以只能输出单个匹配值。
适配CSV表格
生成的数组中,undefined会在CSV导出时自动转为空单元格,完全符合你给出的表格结构要求。
内容的提问来源于stack exchange,提问作者too twiisted
相关产品推荐
相关产品推荐

