Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 消除对象数组中的重复项_Javascript_Arrays - Fatal编程技术网

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是我个人最喜欢的解决方案,而且它看起来只是稍微快一点,但并不重要