如何在JavaScript中按名称属性匹配两个数组对象?求简化方案
简洁实现数组名称匹配需求
给定两个数组,我们需要筛选出数组2中name属性值被数组1任意对象的name属性值包含的元素,以下是两种简洁实现方式:
方法一:高阶函数组合(直观简洁)
利用Array.filter和Array.some的组合,直接完成筛选逻辑:
const array1 = [{name:'danny ro',age:14},{name:'Rose tl', age:17},{name:'Ali ga', age:15}]; const array2 = [{name:'danny',class:'A'},{name:'Ron', class:'D'}]; const result = array2.filter(item2 => array1.some(item1 => item1.name.includes(item2.name)) ); console.log(result); // 输出: [{name:'danny',class:'A'}]
逻辑说明
filter遍历数组2,保留符合条件的元素some检查数组1中是否存在任意一个对象的name包含当前数组2元素的name,只要有一个满足就返回true
方法二:预提取名称(性能优化)
如果数组数据量较大,先提取数组1的所有name值,避免每次some都重复遍历数组1,提升执行效率:
const array1 = [{name:'danny ro',age:14},{name:'Rose tl', age:17},{name:'Ali ga', age:15}]; const array2 = [{name:'danny',class:'A'},{name:'Ron', class:'D'}]; // 提前提取数组1的所有name到单独数组 const array1Names = array1.map(item => item.name); const result = array2.filter(item2 => array1Names.some(name => name.includes(item2.name)) ); console.log(result); // 输出: [{name:'danny',class:'A'}]
扩展:大小写不敏感匹配
如果需要忽略大小写(比如数组1是Danny ro,数组2是danny也能匹配),可以修改判断逻辑:
name.toLowerCase().includes(item2.name.toLowerCase())
内容的提问来源于stack exchange,提问作者Damkulul
相关产品推荐
相关产品推荐

