如何在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