消除对象数组中的重复项

时间:2019-09-23 15:30:46

标签: javascript arrays

我试图摆脱对象数组中的重复项。我希望代码是线性的,所以我使用哈希表:

output = Array.from(new Set(output.map(e => e.company)))
  .map(company => { return output.find(e => e.company === company) })

此代码可正确用于以下对象数组:

let output = [
  { company: 'sony'},
  { company: 'sony'},
  { company: 'apple'}
]

但是,我想重用这段代码,所以我想将其移动到使用数组outputcompany字符串的函数中。我不知道该怎么做,我这样尝试过:

const uniq = (array, key) => {
  return Array.from(new Set(array.map( e => e[key] )))
    .map(key => { return array.find(e => e[key] === key) })
}

但是此返回数组有两个未定义。


第二件事是,对于这种琐碎的任务而言,这是非常复杂的代码。有没有更简单的方法可以在不损失性能的情况下做到这一点?

6 个答案:

答案 0 :(得分:3)

这种单行代码适用于任意对象,不一定是key:value对:

let uniqBy = (a, key) => [...new Map(a.map(x => [x[key], x]).reverse()).values()];

//

let data = [
    {company: 'sony', more: 1},
    {company: 'apple', more: 1},
    {company: 'sony', more: 2},
    {company: 'sony', more: 3},
    {company: 'apple', more: 3},
]

console.log(uniqBy(data, 'company'))

如果您不关心结果的顺序,也可以跳过.reverse()

答案 1 :(得分:2)

您可以映射唯一值并创建一个新对象。

const 
    unique = (array, key) => Array.from(new Set(array.map(o => o[key])), value => ({ [key]: value }));

var output = [{ company: 'sony'}, { company: 'sony'}, { company: 'apple'}];

console.log(unique(output, "company"));

答案 2 :(得分:1)

您有命名冲突,只需重命名第二个key

let input = [{ company: "sony" }, { company: "sony" }, { company: "apple" }];

const uniq = (array, key) => {
  return Array.from(new Set(array.map(e => e[key]))).map(key1 => {
    //                                                   ^^^^
    return array.find(e => e[key] === key1);
    //                                ^^^^
  });
};

const result = uniq(input, "company");

console.log(result);

答案 3 :(得分:1)

我认为问题是您正在覆盖key回调中.map()的定义。这个版本-为回调参数使用单独的变量名-似乎可以满足您的要求:

let output = [
  { company: 'sony'},
  { company: 'sony'},
  { company: 'apple'}
]
const uniq = (array, key) => {
  return Array.from(new Set(array.map( e => e[key] )))
    .map(x => { return array.find(e => e[key] === x) })
}

console.log(uniq(output, "company"));

答案 4 :(得分:1)

您需要将第二个map参数重命名为key之外的其他名称,否则find内部的key不会是传递给函数的参数key

let output = [
  { company: 'sony'},
  { company: 'sony'},
  { company: 'apple'}
]

const uniq = (array, key) => {
  return Array.from(new Set(array.map( e => e[key] )))
    .map(k => { return array.find(e => e[key] === k) })
}

console.log(uniq(output, 'company'));

答案 5 :(得分:0)

如果允许您使用Lodash,则有一种消除重复项的简单方法

_.uniqBy(your_data, 'company');