Javascript 消除对象数组中的重复项
我正试图消除对象数组中的重复项。我希望我的代码是线性的,所以我使用哈希表:Javascript 消除对象数组中的重复项,javascript,arrays,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'}, {
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'}
]
但问题是我想重用这个代码,所以我想把它移到函数中,这个函数将接受数组输出
和公司
字符串。我不知道怎么做,我试着这样做:
const uniq = (array, key) => {
return Array.from(new Set(array.map( e => e[key] )))
.map(key => { return array.find(e => e[key] === key) })
}
但是这个返回数组有两个未定义的数组
第二件事是,对于这样一个琐碎的任务,它的代码相当复杂。有没有更简单的方法可以在不损失性能的情况下做到这一点?如果允许使用Lodash,有一种简单的方法可以消除重复项
_.uniqBy(your_data, 'company');
如果存在命名冲突,只需重命名第二个
键
:
let input=[{公司:“索尼”},{公司:“索尼”},{公司:“苹果”}];
常量uniq=(数组,键)=>{
返回Array.from(新集合(Array.map(e=>e[key])).map(key1=>{
// ^^^^
返回array.find(e=>e[key]==key1);
// ^^^^
});
};
const result=uniq(输入,“公司”);
控制台日志(结果)
我认为问题在于您在.map()
回调中覆盖了键的定义。此版本(回调参数有一个单独的变量名)似乎满足了您的需要:
let输出=[
{公司:'索尼'},
{公司:'索尼'},
{苹果公司}
]
常量uniq=(数组,键)=>{
返回Array.from(新集合(Array.map(e=>e[key]))
.map(x=>{return array.find(e=>e[key]==x})
}
console.log(uniq(输出,“公司”)
您需要将第二个映射
参数重命名为键
以外的其他参数,否则键
内部查找将不是传递给函数的参数键
:
let输出=[
{公司:'索尼'},
{公司:'索尼'},
{苹果公司}
]
常量uniq=(数组,键)=>{
返回Array.from(新集合(Array.map(e=>e[key]))
.map(k=>{return array.find(e=>e[key]==k})
}
log(uniq(输出,'company'))代码>您可以映射唯一值并创建新对象
const
unique=(array,key)=>array.from(新集合(array.map(o=>o[key])),value=>({[key]:value}));
var输出=[{company:'sony'},{company:'sony'},{company:'apple'}];
日志(唯一的(输出,“公司”)代码>此一行程序适用于任意对象,不一定是键:值对:
让uniqBy=(a,key)=>[…新映射(a.Map(x=>[x[key],x]).reverse()).values();
//
让数据=[
{公司:'索尼',更多信息:1},
{公司:'苹果',更多信息:1},
{公司:'索尼',更多信息:2},
{公司:'索尼',更多信息:3},
{公司:'苹果',更多信息:3},
]
console.log(uniqBy(data,'company'))
我认为这和@Nina Scholz是我个人最喜欢的解决方案,而且它看起来只是稍微快一点,但并不重要