通过关键字从Java对象数组中查找重复值

时间:2018-08-23 08:36:33

标签: javascript arrays

我知道这个问题已被多次回答。 但是我没有找到能帮助我的解决方案。

我得到了一个带有ProductImage属性的对象数组。我只想获取具有相同名称的对象。

我的数组的样子:

Name

所以我只想得到:

[
  {
    Name: 'test',
    coolProperty: 'yeahCool1'
  },
  {
    Name: 'test1',
    coolProperty: 'yeahCool2'
  },
  {
    Name: 'test2',
    coolProperty: 'yeahCool3'
  },
  {
    Name: 'test3',
    coolProperty: 'yeahCool4'
  },
  {
    Name: 'test',
    coolProperty: 'yeahCool5'
  }
]

我希望有人可以帮助我:)

3 个答案:

答案 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);

考虑到性能,这不是最佳解决方案。只是想添加替代方法。

希望有帮助!