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

JavaScript中基于根层级与嵌套层级属性的数组过滤

实现基于根层级与嵌套属性的数组过滤

我们需要从input1数组中筛选出符合以下条件的记录:在input2数组中存在至少一条记录,同时满足两个匹配规则:

  • input1的根层级name属性与input2的对应名称属性(如fullname或name)相等
  • input1的嵌套属性address.city与input2的address.city属性相等

原代码的核心问题在于:

  1. 未完整定义两组需要匹配的属性规则
  2. 未处理input2中部分记录使用fullname而非name作为名称属性的情况

以下是修正后的实现代码:

// First Array
const input1 = [
  {
    'name': "name1",
    'email': "emai2@email.com",
    'age': 10,
    'address': {
      'city': "city1"
    }
  },
  {
    'name': "name2",
    'email': "emai2@email.com",
    'age': 20,
    'address': {
      'city': "city2"
    }
  }
];

// Second Array
const input2 = [
  {
    'id': 1,
    'fullname': "name1",
    'emailaddress': "emai2@email.com",
    'age': 10,
    'address': {
      'city': "city1"
    }
  },
  {
    'id': 5,
    'name': "name2",
    'email': "emai55@email.com",
    'age': 20,
    'address': {
      'city': "city3"
    }
  }
];

// 定义两组匹配规则:input1的键对应input2的键
const matchRules = [
  { input1Key: "name", input2Keys: ["name", "fullname"] }, // input1的name匹配input2的name或fullname
  { input1Key: "address.city", input2Key: "address.city" } // 嵌套属性直接匹配
];

// 工具函数:根据路径获取对象属性值
const getProperty = (obj, path) => {
  return path.split('.').reduce((current, key) => current?.[key], obj);
};

// 执行过滤
const matchedRecords = input1.filter(item1 => {
  return input2.some(item2 => {
    return matchRules.every(rule => {
      if (rule.input2Keys) {
        // 处理input2有多个可能键的情况
        const item1Value = getProperty(item1, rule.input1Key);
        return rule.input2Keys.some(key => getProperty(item2, key) === item1Value);
      } else {
        // 单一键匹配
        return getProperty(item1, rule.input1Key) === getProperty(item2, rule.input2Key);
      }
    });
  });
});

console.log(matchedRecords);
// 输出:[{ name: "name1", email: "emai2@email.com", age: 10, address: { city: "city1" } }]

代码逻辑说明

  1. 匹配规则定义:matchRules数组明确了两个需要匹配的属性,针对name属性允许匹配input2中的name或fullname字段,兼容数据结构不一致的场景。
  2. 属性获取工具函数:getProperty通过路径字符串(如address.city)递归获取嵌套属性值,简化嵌套属性的访问逻辑。
  3. 过滤逻辑:
    • 用input1.filter遍历每条待筛选记录
    • 对每条input1记录,通过input2.some检查是否存在匹配的input2记录
    • 最后通过matchRules.every确保所有匹配规则都被满足

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:25:24