JavaScript/NodeJS实现嵌套数组匹配,无匹配输出NULL
问题解决:根据ref_id匹配嵌套数组生成目标数组
问题背景
有两个嵌套数组:
let actual = [["123", "short_text"], ["456", "short_text"], ["789", "varchar"], ["101", "long_text"], ["112", "short_text"]]; let values = [["789", "blabla"], ["456", "lala"]];
actual是数据库潜在字段,格式为[ref_id, field_type],作为标准结构values是测试结果源,格式为[ref_id, test_answer]
需求:根据ref_id匹配两个数组,有对应test_answer则输出该值,无匹配则输出"NULL",预期结果:
let controlledArray = [ {id: "123", val: "NULL"}, {id: "456", val: "lala"}, {id: "789", val: "blabla"}, {id: "101", val: "NULL"}, {id: "112", val: "NULL"}, ];
原代码错误分析
你写的代码存在两个核心问题:
- 对象键错误:遍历
actual时,直接用数组元素i作为对象键,数组会被隐式转为字符串(比如"456,short_text"),而不是使用ref_id(即i[0])作为键,导致后续无法匹配values中的ref_id。 - 赋值错误:遍历
values时,同样用数组元素i作为键,且赋值的是整个数组i,而非需要的test_answer(即i[1])。
正确实现代码
先把values转换成以ref_id为键的映射表,再遍历actual生成目标数组,这样查找效率更高:
let actual = [["123", "short_text"], ["456", "short_text"], ["789", "varchar"], ["101", "long_text"], ["112", "short_text"]]; let values = [["789", "blabla"], ["456", "lala"]]; // 把values转成ref_id到test_answer的映射 const valueMap = new Map(values.map(item => [item[0], item[1]])); // 遍历actual生成目标数组 const controlledArray = actual.map(item => { const refId = item[0]; return { id: refId, val: valueMap.get(refId) || "NULL" }; }); console.log(controlledArray);
运行后会得到符合预期的结果。
也可以用普通对象实现映射:
let actual = [["123", "short_text"], ["456", "short_text"], ["789", "varchar"], ["101", "long_text"], ["112", "short_text"]]; let values = [["789", "blabla"], ["456", "lala"]]; const valueMap = {}; values.forEach(item => { valueMap[item[0]] = item[1]; }); const controlledArray = actual.map(item => ({ id: item[0], val: valueMap[item[0]] ?? "NULL" })); console.log(controlledArray);
内容的提问来源于stack exchange,提问作者mikswe
相关产品推荐
相关产品推荐

