ES6用于删除/检测数组中重复对象的数组方法

时间:2018-01-16 14:45:36

标签: javascript arrays ecmascript-6

如果数组已经没有该对象,我试图将一个对象添加到数组中。

所以我有一个数组如下

[{id:1},{id:2},{id:3}]

我想检查id:1是否存在,如果不存在则添加,如果是,则显示错误或记录消息。

我可以使用如下的简单数组来实现这一点。

let result =[1,2,2,3,1,4,1,4,2,3].filter((el, i, a) => i === a.indexOf(el));

我无法弄清楚如何用对象数组实现相同的效果。

由于

2 个答案:

答案 0 :(得分:2)

您可以使用Array#filter,并检查长度:

const arr = [{id:1},{id:2},{id:3}];
const el = { id: 1 };
const exists = arr.filter(({ id }) => id === el.id).length > 0;

console.log(exists);

或者您可以使用Array#find,它比Array#filter略有优势,因为它会在找到项目后立即停止。

const arr = [{id:1},{id:2},{id:3}];
const el = { id: 1 };
const exists = !!arr.find(({ id }) => id === el.id);

console.log(exists);

您可以使用具有proxy陷阱的set包装数组,以防止自动插入重复项:

const arr = [{id:1},{id:2},{id:3}];

const arrayChangeHandler = {
  set: function(target, property, value, receiver) {
    if(property === 'length') {
      return true;
    }
    
    const exists = !!target.find(({ id }) => id === value.id);
    if(exists) {
      console.log(`Id: ${value.id} exists!`); // you can return false here, and it will throw an error
    } else {
      target.push(value);
    }
        
    return true;
  }
};
  
const pArr = new Proxy(arr, arrayChangeHandler);

pArr.push({ id: 1 });
pArr.push({ id: 10 });

console.log(JSON.stringify(arr));

答案 1 :(得分:2)

您可以使用some检查重复内容,例如:



// array with duplicate objects {id:1}
let arr = [{id:1},{id:1},{id:2}]
function duplicateFound(arr){
  const ids = arr.map(x => x.id);
  return ids.some((item, idx) => ids.indexOf(item) != idx);
}
console.log(duplicateFound(arr));

// array with not duplicates
arr = [{id:1},{id:2},{id:3}]
console.log(duplicateFound(arr));