js对象数组中删除出现次数为偶数次的项,保留奇数次的项

在对象数组中删除出现次数为偶数次的项,保留奇数次的项

var a = [
    { id: 1, content: '11' }, { id: 2, content: '22' }, { id: 1, content: '11' }, 
    { id: 2, content: '22' }, { id: 3, content: '33' },{ id: 4, content: '44' }, 
    { id: 4, content: '44' }, { id: 4, content: '44' }
]
 
//  这个时候数组a中  有四项为两两重复 有一项只出现一次  有一项重复了三次
//  现在想得到
a = [{ id: 3, content: '33' },{ id: 4, content: '44' }]
// 在数组中保留出现次数为奇数次的项  删除偶数次的项
 

有无大佬帮忙看看

阅读 4.8k
5 个回答

准备一个新容器。
遍历旧数组的每一项

检查新容器里是否存在该项
若不存在则添加进新容器
若存在则从新容器中移除 

这个在算法上实现不难,但要做到效率高,还要稳定则比较困难。

var a=[
    { id: 1, content: '11' }, { id: 2, content: '22' }, { id: 1, content: '11' }, 
    { id: 2, content: '22' }, { id: 3, content: '33' },{ id: 4, content: '44' }, 
    { id: 4, content: '44' }, { id: 4, content: '44' }
];

var b={};
for(let i=0;i<a.length;i++){
    let key=JSON.stringify(a[i]);
    if(b.hasOwnProperty(key)){
        b[key]=(b[key]+1)%2;
    }else{
        b[key]=1;
    }
}
a=[];
for(let key in b){
    if(b[key]==1){
        a.push(JSON.parse(key));
    }
}
console.log(a)
const a = [
    { id: 1, content: '11' }, { id: 2, content: '22' }, { id: 1, content: '11' },
    { id: 2, content: '22' }, { id: 3, content: '33' }, { id: 4, content: '44' },
    { id: 4, content: '44' }, { id: 4, content: '44' }
];

const m = new Map();

for (const item of a) {
    const key = JSON.stringify(item);

    m.set(key, (m.get(key) ?? 0 ) + 1)
}

const target = []

m.forEach((v, k) => {
    if (v % 2 !== 0 ) {
        target.push(JSON.parse(k))
    }
})

console.log(target)
let b = a.reduce((prev, next) => {
  let result = prev.find((element, index) => element.id === next.id && prev.splice(index, 1));
  !result && prev.push(next)
  return prev
}, [])
console.log(b) // [ { id: 3, content: '33' }, { id: 4, content: '44' } ]

这样性能是否会好一些?

obj = {}
a.forEach((item) => {
    obj[item.id] ?  delete obj[item.id] : obj[item.id] = item
})

console.log(Object.values(obj))
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题