我有一个对象数组,如何才能获得具有重复属性值的对象。
var array = [{"id":1,"attr":5},{"id":2,"attr":3},{"id":3,"attr":5}];
此处应返回array[0]
和array[2]
,因为这些元素具有重复的属性值(attr = 5)。
并且还返回唯一数组。
array = [{“id”:2,“attr”:3}];
答案 0 :(得分:2)
通过使用哈希表临时收集组的第一个对象或仅表示组的重复项,对未排序数据采用单循环方法。
var array = [{ "id": 1, "attr": 5 }, { "id": 2, "attr": 3 }, { "id": 3, "attr": 5 }],
hash = Object.create(null),
result = array.reduce((r, o) => {
if (o.attr in hash) {
if (hash[o.attr]) {
r.push(hash[o.attr]);
hash[o.attr] = false;
}
r.push(o);
} else {
hash[o.attr] = o;
}
return r;
}, []);
console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)
您可以使用生成器函数和嵌套循环来检查重复项:
function* dupes(arr, key) {
for(const [index, el] of arr.entries())
for(const el2 of arr.slice(index + 1))
if(index !== index2 && el[key] === el2[key])
yield [el, el2];
}
所以你可以用它作为:
for(const [dupe1, dupe2] of dupes(yourArray, "attr"))
console.log(`${dupe1} collides with ${dupe2}`);