从一个数组A中查找数组B中某个属性

  const arrA = [
    {
      name: '张三',
      age: 19
    },
    {
      name: '李四',
      age: 20
    },
    {
      name: '赵五',
      age: 21
    }
  ]
  const arrB = [
    {
      name: '张三',
      age: 19,
      height: 100
    },
    {
      name: '周八',
      age: 30,
      height: 99
    }
  ]

从数组A中筛选出,元素的name属性不等于数组B的name属性的元素,组成新的数组
有什么好的办法?

阅读 1.2k
2 个回答
function excludeByName(arrA, arrB) {
  const excluded = new Set(arrB.map(i => i.name))
  return arrA.filter(i => !excluded.has(i.name))
}

const arrA = [
  {
    name: '张三',
    age: 19
  },
  {
    name: '李四',
    age: 20
  },
  {
    name: '赵五',
    age: 21
  }
]
const arrB = [
  {
    name: '张三',
    age: 19,
    height: 100
  },
  {
    name: '周八',
    age: 30,
    height: 99
  }
]

console.log(excludeByName(arrA, arrB)) // [{name:"李四",age:20},{name:"赵五",age:21}]

线性复杂度

数据量少不在乎性能,一代码量少为主,可以

arrA.filter(item => arrB.some(citem => item.name === citem.name))

提升性能可以减少循环次数

let nameObj = arrB.reduce((obj, item) => {
    obj[item.name] = true
    return obj
}, {})

arrA.filter(item => nameObj[item.name])
已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题