js 内嵌数组去重

arr2对比list中的数组 有相同的则删除arr2中ids所在的对象 没有则保留 最终结果返回arr2的新数组 有没有高效的方法

let arr1 ={
    id:1,
    list:[{
    ids:"444"
    },{
    ids:"5555"
    }]
}

let arr2 =[
    {
    ids:"444"
    },{
    ids:"777"
    }
]

问题出现的环境背景及自己尝试过哪些方法

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

你期待的结果是什么?实际看到的错误信息又是什么?

阅读 2.2k
5 个回答

高效可能要根据实际情况如数据量而论,思路供参考

const newArr2 = arr2.filter(x => arr1.list.every(y => y.ids !== x.ids))
const newArr2 = arr2.filter(x => !arr1.list.some(y => y.ids === x.ids))
const newArr2 = arr2.filter(x => !arr1.list.find(y => y.ids === x.ids))
const newArr2 = arr2.filter(x => arr1.list.findIndex(y => y.ids === x.ids) < 0)
const sList = new Set(arr1.list.map(x => x.ids))
const newArr2 = arr2.filter(x => !sList.has(x.ids))
const [newArr2] = arr2.reduce(
  (o, x) => (o[1].has(x.ids) || o[0].push(x), o),
  [[], new Set(arr1.list.map(x => x.ids))]
)
const pure = (arr1, arr2) => {
  arr1.forEach(({ ids }) => {
    const idsArr = arr2.map(({ ids }) => ids);
    const idx = idsArr.indexOf(ids);
    if (~idx) {
      arr2.splice(idx, 1);
    }
  });
  return arr2.map(({ ids }) => ({ ids }));
};
const filterArr = (target,source)=>{
    return target.filter(ele=>source.findIndex(e=>e.ids==ele.ids)==-1)
}
let result = filterArr(arr2,arr1.list);
console.log(result)
const pullItem = (a1,a2) =>a1.filter(v1=>!a2.some(v2 => v2.ids === v1.ids))
console.log(pullItem(arr2,arr1.list))

高效但是是以作假的方法实现,仅供参考

let arr1Str = JSON.stringify(arr1);
let result = arr2.filter(item => !arr1Str.includes(JSON.stringify(item)));
console.log(result);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题