JavaScript中基于根层级与嵌套层级属性的数组过滤
实现基于根层级与嵌套属性的数组过滤
我们需要从input1数组中筛选出符合以下条件的记录:在input2数组中存在至少一条记录,同时满足两个匹配规则:
input1的根层级name属性与input2的对应名称属性(如fullname或name)相等input1的嵌套属性address.city与input2的address.city属性相等
原代码的核心问题在于:
- 未完整定义两组需要匹配的属性规则
- 未处理
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" } }]
代码逻辑说明
- 匹配规则定义:
matchRules数组明确了两个需要匹配的属性,针对name属性允许匹配input2中的name或fullname字段,兼容数据结构不一致的场景。 - 属性获取工具函数:
getProperty通过路径字符串(如address.city)递归获取嵌套属性值,简化嵌套属性的访问逻辑。 - 过滤逻辑:
- 用
input1.filter遍历每条待筛选记录 - 对每条
input1记录,通过input2.some检查是否存在匹配的input2记录 - 最后通过
matchRules.every确保所有匹配规则都被满足
- 用
内容的提问来源于stack exchange,提问作者user13000875
相关产品推荐
相关产品推荐

