我知道这个问题已被多次回答。 但是我没有找到能帮助我的解决方案。
我得到了一个带有ProductImage
属性的对象数组。我只想获取具有相同名称的对象。
我的数组的样子:
Name
所以我只想得到:
[
{
Name: 'test',
coolProperty: 'yeahCool1'
},
{
Name: 'test1',
coolProperty: 'yeahCool2'
},
{
Name: 'test2',
coolProperty: 'yeahCool3'
},
{
Name: 'test3',
coolProperty: 'yeahCool4'
},
{
Name: 'test',
coolProperty: 'yeahCool5'
}
]
我希望有人可以帮助我:)
答案 0 :(得分:1)
对于O(N)
解决方案,首先将数组reduce
放入一个对象,该对象计算每个名称的出现次数,然后filter
以出现次数为2的输入:< / p>
const arr = [
{
Name: 'test',
coolProperty: 'yeahCool1'
},
{
Name: 'test1',
coolProperty: 'yeahCool2'
},
{
Name: 'test2',
coolProperty: 'yeahCool3'
},
{
Name: 'test3',
coolProperty: 'yeahCool4'
},
{
Name: 'test',
coolProperty: 'yeahCool5'
}
];
const counts = arr.reduce((a, { Name }) => {
a[Name] = (a[Name] || 0) + 1;
return a;
}, {});
console.log(arr.filter(({ Name }) => counts[Name] === 2));
答案 1 :(得分:0)
您可以使用reduce()
和filter()
方法来获得所需的结果。
使用filter()
方法需要检查长度是否大于2,然后需要将其推入reduce()
方法内部的新数组中
演示
const arr =[{"Name":"test","coolProperty":"yeahCool1"},{"Name":"test1","coolProperty":"yeahCool2"},{"Name":"test2","coolProperty":"yeahCool3"},{"Name":"test3","coolProperty":"yeahCool4"},{"Name":"test","coolProperty":"yeahCool5"}];
let getCount = (name)=>{
return arr.filter(o => o.Name == name).length;
}
console.log(arr.reduce((r,item) => {
let len = getCount(item.Name);
return r.concat(len>1?item:[]);
}, []));
答案 2 :(得分:0)
我看到您已经有了答案。因此,我想到了使用map
添加另一种方法。
var counts = {};
var repeats = {};
arr.map(i => {
counts[i['Name']] = (counts[i['Name']] || []);
counts[i['Name']].push(i);
if (counts[i['Name']].length > 1) {
repeats[i['Name']] = counts[i['Name']];
}
});
console.log(repeats);
考虑到性能,这不是最佳解决方案。只是想添加替代方法。
希望有帮助!