我有一个非常简单的数组:
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)
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,那么您可以将其包含在条件中。我已经更新了答案。
| 归档时间: |
|
| 查看次数: |
830 次 |
| 最近记录: |