如何在javascript中的数组中添加非重复对象?

如何在javascript中的数组中添加非重复对象?,javascript,arrays,object,Javascript,Arrays,Object,我想将不重复的对象添加到新数组中 var array = [ { id: 1, label: 'one' }, { id: 1, label: 'one' }, { id: 2, label: 'two' } ]; var uniqueProducts = array.filter(function(elem, i, array) { return array.indexOf(elem) === i; }); c

我想将不重复的对象添加到新数组中

var array = [
  {
    id: 1,
    label: 'one'
  },
  {
    id: 1,
    label: 'one'
  },
  {
    id: 2,
    label: 'two'
  }
];

var uniqueProducts = array.filter(function(elem, i, array) {
    return array.indexOf(elem) === i;
});

console.log('uniqueProducts', uniqueProducts);
// output: [object, object, object] 

您可以使用哈希表存储找到的
id

var数组=[{id:1,标签:'one'},{id:1,标签:'one'},{id:2,标签:'two'}],
uniqueProducts=array.filter(函数(elem){
return!this[elem.id]&&(this[elem.id]=true);
},Object.create(null));

console.log('uniqueProducts',uniqueProducts)
您可以使用哈希表存储找到的
id

var数组=[{id:1,标签:'one'},{id:1,标签:'one'},{id:2,标签:'two'}],
uniqueProducts=array.filter(函数(elem){
return!this[elem.id]&&(this[elem.id]=true);
},Object.create(null));

console.log('uniqueProducts',uniqueProducts)
您可以使用
Object.keys()
map()
为每个对象创建键,并筛选以删除重复项

var数组=[{
id:1,
标签:“一”
}, {
id:1,
标签:“一”
}, {
id:2,
标签:“两个”
}];
var result=array.filter(函数(e){
var key=Object.keys(e).map(k=>e[k]).join(“|”);
如果(!此[键]){
此[键]=真;
返回true;
}
}, {});

console.log(result)
您可以使用
Object.keys()
map()
为每个对象创建键,并筛选以删除重复项

var数组=[{
id:1,
标签:“一”
}, {
id:1,
标签:“一”
}, {
id:2,
标签:“两个”
}];
var result=array.filter(函数(e){
var key=Object.keys(e).map(k=>e[k]).join(“|”);
如果(!此[键]){
此[键]=真;
返回true;
}
}, {});

console.log(result)
通常,您使用一个对象来跟踪您的唯一密钥。然后,将对象转换为包含所有特性值的数组

最好包含一个唯一的
id
类属性,您可以将其用作标识符。如果没有,则需要使用
JSON.stringify
或自定义方法自己生成。字符串化对象有一个缺点:键的顺序不必一致

您可以创建一个支持深度比较的
objectsAreEqual
方法,但这将大大降低您的函数速度

分两步进行:

var数组=[{id:1,标签:“一”},{id:1,标签:“一”},{id:2,标签:“两”}];
//创建对象的字符串表示形式
函数getHash(obj){
返回Object.keys(obj)
.sort()//不必对键进行排序,请在此处手动进行排序
.map(函数(k){
返回k+“”+obj[k];//前缀键名so{a:1}!={b:1}
})
.join(“”)//通过_
}
函数getHashBetterSolution(obj){
return obj.id;//在对象中包含唯一id并使用该id
};
//使用“getHashBetterSolution”时:
//{'1':{id:'1',label:'one'},'2':/*etc.*/}
var uniquesObj=array.reduce(函数(res,cur){
res[getHash(cur)]=cur;
返回res;
}, {});
//通过循环所有键将其转换回数组
var uniquesArr=Object.keys(uniquesObj).map(函数(k){
返回uniquesObj[k];
});
控制台日志(uniquesArr);
//显示散列

控制台日志(uniquesObj)通常,使用对象跟踪唯一关键点。然后,将对象转换为包含所有特性值的数组

最好包含一个唯一的
id
类属性,您可以将其用作标识符。如果没有,则需要使用
JSON.stringify
或自定义方法自己生成。字符串化对象有一个缺点:键的顺序不必一致

您可以创建一个支持深度比较的
objectsAreEqual
方法,但这将大大降低您的函数速度

分两步进行:

var数组=[{id:1,标签:“一”},{id:1,标签:“一”},{id:2,标签:“两”}];
//创建对象的字符串表示形式
函数getHash(obj){
返回Object.keys(obj)
.sort()//不必对键进行排序,请在此处手动进行排序
.map(函数(k){
返回k+“”+obj[k];//前缀键名so{a:1}!={b:1}
})
.join(“”)//通过_
}
函数getHashBetterSolution(obj){
return obj.id;//在对象中包含唯一id并使用该id
};
//使用“getHashBetterSolution”时:
//{'1':{id:'1',label:'one'},'2':/*etc.*/}
var uniquesObj=array.reduce(函数(res,cur){
res[getHash(cur)]=cur;
返回res;
}, {});
//通过循环所有键将其转换回数组
var uniquesArr=Object.keys(uniquesObj).map(函数(k){
返回uniquesObj[k];
});
控制台日志(uniquesArr);
//显示散列

控制台日志(uniquesObj)
您可以使用
reduce
提取唯一数组和唯一ID,如下所示:

var数组=[{id:1,标签:“一”},{id:1,标签:“一”},{id:2,标签:“两”}];
var result=array.reduce(函数(prev,curr){
if(上一个id索引of(当前id)=-1){
上一个数组推送(当前);
前id推送(当前id);
}
返回上一个;
},{array:[],id:[]});
控制台日志(结果)

.as console wrapper{top:0;max height:100%!important;}
您可以使用
reduce
提取唯一数组和唯一ID,如下所示:

var数组=[{id:1,标签:“一”},{id:1,标签:“一”},{id:2,标签:“两”}];
var result=array.reduce(函数(prev,curr){
if(上一个id索引of(当前id)=-1){
上一个数组推送(当前);
前id推送(当前id);
}
返回上一个;
},{array:[],id:[]});
控制台日志(结果)

.as控制台包装{top:0;max height:100%!important;}
我喜欢使用es6的基于类的方法。该示例使用lodash的q.isEqual方法来确定对象的相等性

var数组=[{
id:1,
标签:“一”
}, {
id:1,
标签:“一”
}, {
id:2,
标签:“两个”
}];
cla