【问题标题】: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 个产品的列表是可以的,但如果你有成千上万个产品会发生什么?
  • 它是如何重复的?因为从我的角度来看,这是完全不同的问题。

标签: javascript arrays


【解决方案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;

    【讨论】:

      猜你喜欢
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-10
      • 2021-01-19
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多