如果特定键不存在,则将对象推送到数组[重复]

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 数组的问题

仅当值不存在时才使用 lodash 推送到数组?

如何保持Javascript数组排序,而不对其进行排序

检查对象值是不是存在于 Javascript 对象数组中,如果不存在则将新对象添加到数组

php 在数组中的特定键后插入值或键/值对。如果key不存在,则将值附加到数组的末尾。

php 在数组中的特定键后插入值或键/值对。如果key不存在,则将值附加到数组的末尾。