[英]Inserting unique objects into array of objects using javascript?
我正在执行对一组对象的推送操作。 我的代码如下所示,
var obj = {"id":1, "fname":"john", "lname":"doe"};
var userArray = [{
"id": 1,
"fname": "john",
"lname": "doe"
}, {
"id": 2,
"fname": "john",
"lname": "doe"
}];
userArray.forEach(function (element) {
if(element.id !== obj.id) {
userArray.push(obj);
}
});
console.log(userArray);
当我对已经包含要推送的对象的userArray进行推送操作时(从代码中是var obj = {"id":1, "fname":"john", "lname":"doe"};
)在第二遍for循环中将其推送到数组。
预期的输出应该是userArray = [{"id": 1,"fname": "john","lname": "doe"}, {"id": 2, "fname": "john","lname": "doe"}];
但我得到userArray = [{"id": 1,"fname": "john","lname": "doe"}, {"id": 2, "fname": "john","lname": "doe"}, {"id": 1,"fname": "john","lname": "doe"}];
如何仅将唯一对象推送到数组?
使用数组.some
方法检查列表中是否已存在具有该ID的项目。 如果没有,则推入数组:
var obj = {"id":1, "fname":"john", "lname":"doe"}; var userArray = [{ "id": 1, "fname": "john", "lname": "doe" }, { "id": 2, "fname": "john", "lname": "doe" }]; var existing = userArray.some(element => element.id === obj.id); if(!existing) { userArray.push(obj); } console.log(userArray);
您需要搜索具有相同ID的用户,如果该用户不存在,则可以添加它。 您需要先遍历整个数组以检查所有元素。
var obj = {"id":3, "fname":"john", "lname":"doe"};
var userArray = [{
"id": 1,
"fname": "john",
"lname": "doe"
}, {
"id": 2,
"fname": "john",
"lname": "doe"
}];
/*Search for an user with the same id*/
var found = userArray.find(function(user) {
return user.id == obj.id;
});
/*Add the user if not found*/
if(!found){
userArray.push(obj);
}
我看到两种可能的解决方案:
1)检查id
是否不存在。
var exists = false;
userArray.forEach(function (element) { // n/2 checks on average
if(element.id == obj.id) { // (this specific awful code, always n checks)
exists = true;
}
});
if (!exists) {
userArray.push(obj);
}
这段代码(或任何改进的基于循环的版本)每次都会迭代数组,这就是为什么我更喜欢第二种选择的原因。
2)使userArray
成为id
为索引的对象。
var obj = {"id":1, "fname":"john", "lname":"doe"};
var userArray = {
1: {
"id": 1,
"fname": "john",
"lname": "doe"
},
2: {
"id": 2,
"fname": "john",
"lname": "doe"
}
};
if (typeof userArray[obj.id] === 'undefined') { // always 1 check
userArray[obj.id] = obj;
}
console.log(userArray);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.