如果特定键不存在,则将对象推送到数组[重复]
Posted
技术标签:
【中文标题】如果特定键不存在,则将对象推送到数组[重复]【英文标题】:push a object to a array if a specific key is not exists [duplicate] 【发布时间】:2018-08-09 02:59:10 【问题描述】:我有一个产品对象数组,其中包括几个产品详细信息。
var bags = [
product_id: 1 , product_name: "product 1" , quantity: 1 ,
product_id: 2 , product_name: "product 3" , quantity: 1 ,
product_id: 3 , product_name: "product 2" , quantity: 1
];
我可以像这样在这里推送新数组,
bags.push( product_id: 4 , product_name: "product 4" , quantity: 1 );
现在我需要在这个数组中推送一个新对象时,如果该新对象的 product_id
已经存在,那么在已经存在的产品数量上,而不是添加新项目。
假设我将此对象添加到先前已存在于数组中的bags
数组中。
product_id: 1 , product_name: "product 1" , quantity: 3
现在我不需要创建新项目,而是需要我的 bags
数组看起来像这样
var bags = [
product_id: 1 , product_name: "product 1" , quantity: 4 , // <- updated
product_id: 2 , product_name: "product 3" , quantity: 1 ,
product_id: 3 , product_name: "product 2" , quantity: 1
];
【问题讨论】:
我可以知道您的主键以进行比较吗? product_id 还是 product_name? 遍历列表,如果找到 productId 添加数量,如果没有,则将对象添加到列表中。为此目的,也许它会更好地使用另一种结构,例如以 productId 为键,其余为值的字典 @kai 是的,product_id
是这里比较的主要关键
迭代 3 个产品的列表是可以的,但如果你有成千上万个产品会发生什么?
它是如何重复的?因为从我的角度来看,这是完全不同的问题。
【参考方案1】:
var bags = [
product_id: 1 , product_name: "product 1" , quantity: 1 ,
product_id: 2 , product_name: "product 3" , quantity: 1 ,
product_id: 3 , product_name: "product 2" , quantity: 1
];
function addProduct(product)
var found = false;
for( index in bags)
if(bags[index].product_id == product.product_id)
bags[index].quantity += product.quantity;
found = true;
break;
if(!found)
bags.push(product);
var data = product_id: 1 , product_name: "product 1" , quantity: 3 ;
addProduct(data);
console.log(bags);
data = product_id: 10 , product_name: "product 1" , quantity: 3 ;
addProduct(data);
console.log(bags);
【讨论】:
它对我有用,谢谢,伙计 :) 缺少解释。 -1。另外,对于这样明显的问题,请选择寻找类似的链接并将其作为欺骗关闭。我们是来帮忙的,而不是免费做别人的工作。 @MuhammadRayhan 我已经更新了代码。添加了 return 语句以跳出循环。 @Rajesh 感谢您提醒我。就这么做吧。return; // to break out of loop
你检查过它是否真的有吗?【参考方案2】:
var bags = [
product_id: 1 , product_name: "product 1" , quantity: 1 ,
product_id: 2 , product_name: "product 3" , quantity: 1 ,
product_id: 3 , product_name: "product 2" , quantity: 1
];
var data = product_id: 1 , product_name: "product 1" , quantity: 3 ;
bags.map(obj =>
if(obj.product_id == data.product_id && data.hasOwnProperty('quantity'))
obj.quantity += data.quantity;
return; // Break the loop
);
console.log(bags);
【讨论】:
谢谢@King Rayhan :)【参考方案3】:您可以实现一个新的 Array 原型(或简单地创建一个新函数)以在推送之前进行比较。据我所知,Array
的新原型函数称为find
,它会有所帮助。
Array.prototype.updatePush = function(obj)
const foundItem = this.find((item) =>item.product_id === obj.product_id);
if (foundItem)
foundItem.quantity += obj.quantity;
else
this.push(obj);
bags.updatePush( product_id: 1 , product_name: "product 1" , quantity: 3 ); // the product_id 1 object should be updated.
【讨论】:
【参考方案4】:您必须为此使用数组吗?这是将对象用作地图的完美案例。只需使用 product_id
作为对象的键。很容易搜索。
var bags =
1: product_id: 1 , product_name: "product 1" , quantity: 1 ,
2: product_id: 2 , product_name: "product 3" , quantity: 1 ,
3: product_id: 3 , product_name: "product 2" , quantity: 1
function addProduct(bags, product)
var product_id = product.product_id;
if (product_id in bags)
// it's already a product, update quantity
bags[product_id].quantity += product.quantity;
else
// it's not a product, add it.
bags[product_id] = product
addProduct(bags, product_id: 1 , product_name: "product 1" , quantity: 3 )
console.log(bags[1])
// product_id: 1, product_name: 'product 1', quantity: 4
【讨论】:
请选择关闭重复的帖子。这个问题已经回答了不止一次【参考方案5】:您需要以某种方式识别要更新的对象。对于更新第一个对象的情况:
bags[0].quantity = 4;
【讨论】:
以上是关于如果特定键不存在,则将对象推送到数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如果它是一个函数,则将值推送到 javascript 数组的问题
检查对象值是不是存在于 Javascript 对象数组中,如果不存在则将新对象添加到数组