You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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;
}

代码说明

  1. 效率优化:先将data2中每条记录按cols指定列生成唯一标识字符串(用|分隔避免字段值拼接冲突),存入Set集合,后续匹配时时间复杂度为O(1),比每次遍历data2更高效。
  2. 修正原框架错误:将循环条件i < data1改为i < data1.length,变量I修正为小写i。
  3. 动态匹配逻辑:遍历data1时,每条记录生成对应主键标识,与data2的标识集合比对,匹配则加入结果数组。

内容的提问来源于stack exchange,提问作者Mark Yu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 19:15:35