从数组中删除不重复的对象

Sto*_*per 1 javascript arrays

我有一个非常简单的数组:

var arr = [{id: 1, score: 10}, {id: 1, score: 10}, {id: 3, score: 20}, {id: 4, score: 5}];
Run Code Online (Sandbox Code Playgroud)

我想删除那些只出现一次的对象,例如:

{id: 3, score: 20}
{id: 4, score: 5}
Run Code Online (Sandbox Code Playgroud)

所以最终的输出应该是:

[{id: 1, score: 10}, {id: 1, score: 10}]
Run Code Online (Sandbox Code Playgroud)

到目前为止我尝试过的是:

const result = [];

for (let i = 0; i < arr.length; i++) {
    for (let j = i + 1; j < arr.length; j++) {
        if (arr[i].id === arr[j].id && arr[i].score === arr[j].score) {
            result.push({ id: arr[i].id, score: arr[i].score })             
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但这也删除了我的重复项,例如它给了我这个结果:

[{id: 1, score: 10}]
Run Code Online (Sandbox Code Playgroud)

但我需要这个结果:

[{id: 1, score: 10}, {id: 1, score: 10}]
Run Code Online (Sandbox Code Playgroud)

Nit*_*esh 7

Array.filter会有所帮助

id用和的组合过滤数组score,检查该组合的长度是否大于1,即该组合出现多次。

const arr = [{ id: 1, score: 10 }, { id: 1, score: 10 }, { id: 3, score: 20 }, { id: 4, score: 5 }, { id: 77, score: 25, type: 'notthisone' }];
const newArr = arr.filter(item => arr.filter(x => x.id === item.id && x.score === item.score).length > 1 || item.type === 'notthisone');
console.log(newArr);
Run Code Online (Sandbox Code Playgroud)

您的固定解决方案。

arr您必须推送indexi和的值j。但 的索引节点i只能推送一次。

const arr = [{id: 1, score: 10}, {id: 1, score: 10}, {id: 3, score: 20}, {id: 4, score: 5}, {id: 77, score: 25, type: 'notthisone'}];
const result = [];

for (let i = 0; i < arr.length; i++) {
  let isFound = false;
  for (let j = i + 1; j < arr.length; j++) {
    if (arr[i].id === arr[j].id && arr[i].score === arr[j].score) {
      isFound = true;
      result.push(arr[j]);
    }
  }
  if(isFound ||  arr[i].type === 'notthisone') {
      result.push(arr[i]);
  }
}
console.log(result);
Run Code Online (Sandbox Code Playgroud)

编辑:如果您想让一个特定对象具有特定的 key 值type,那么您可以将其包含在条件中。我已经更新了答案。