我试图摆脱对象数组中的重复项。我希望代码是线性的,所以我使用哈希表:
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'}
]
但是,我想重用这段代码,所以我想将其移动到使用数组output
和company
字符串的函数中。我不知道该怎么做,我这样尝试过:
const uniq = (array, key) => {
return Array.from(new Set(array.map( e => e[key] )))
.map(key => { return array.find(e => e[key] === key) })
}
但是此返回数组有两个未定义。
第二件事是,对于这种琐碎的任务而言,这是非常复杂的代码。有没有更简单的方法可以在不损失性能的情况下做到这一点?
答案 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');