如何使用JavaScript基于指定列名数组筛选对象数组匹配项?
需求实现:根据指定主键列匹配数据子集
现有代表数据库记录的对象数组data1:
let data1 = [ {"name": "ethan", "age": 18, "class": "A", "grade": 83}, {"name": "sam", "age": 13, "class": "A", "grade": 43}, {"name": "mark", "age": 14, "class": "D", "grade": 33}, {"name": "dick", "age": 14, "class": "B", "grade": 85}, {"name": "luke", "age": 15, "class": "A", "grade": 93}, {"name": "adam", "age": 5, "class": "C", "grade": 55}, ]
指定列数组cols = ["name", "class"]作为匹配主键,另有对象数组data2:
let data2 = [ {"name": "ethan", "age": 48, "class": "A", "grade": 49}, {"name": "dick", "age": 24, "class": "B", "grade": 43}, ]
需要编写动态函数getSubset,参数为cols、data1、data2,遍历data1中每条记录,检查其cols对应列值是否与data2中某条记录的对应列值完全匹配,若匹配则将该data1记录加入结果数组,最终返回结果数组。
预期输出:
[ {"name": "ethan", "age": 18, "class": "A", "grade": 83}, {"name": "dick", "age": 14, "class": "B", "grade": 85}, ]
实现代码
function getSubset(cols, data1, data2) { let output = []; // 预生成data2的主键标识集合,提升匹配效率 const data2KeySet = new Set(data2.map(item => { return cols.map(col => item[col]).join('|'); })); for (let i = 0; i < data1.length; i++) { const currentItem = data1[i]; // 生成当前data1项的主键标识字符串 const currentKey = cols.map(col => currentItem[col]).join('|'); // 匹配检查 if (data2KeySet.has(currentKey)) { output.push(currentItem); } } return output; }
代码说明
- 效率优化:先将
data2中每条记录按cols指定列生成唯一标识字符串(用|分隔避免字段值拼接冲突),存入Set集合,后续匹配时时间复杂度为O(1),比每次遍历data2更高效。 - 修正原框架错误:将循环条件
i < data1改为i < data1.length,变量I修正为小写i。 - 动态匹配逻辑:遍历
data1时,每条记录生成对应主键标识,与data2的标识集合比对,匹配则加入结果数组。
内容的提问来源于stack exchange,提问作者Mark Yu
相关产品推荐
相关产品推荐

