繁体   English   中英

Javascript - 检查对象数组中是否存在对象并更新数量

[英]Javascript - Check if object exists in array of objects and update quantity

我有一个数组objArray 我想创建一个函数,以便检查是否有另一个具有相同name键的对象。 如果它存在,它将在qty键中添加+1。 如果该对象不存在,则会将新对象推送到该数组。

 var objArray = [ {"name":"bike","color":"blue","qty":2}, {"name":"boat","color":"pink", "qty":1}, ]; var carObj = {"name":"car","color":"red","qty":1}; var bikeObj = {"name":"bike","color":"blue","qty":1}; function checkAndAdd (obj) { for (var i = 0; i < objArray.length; i++) { if (objArray[i].name === obj.name) { objArray[i].qty++; break; } else { objArray.push(obj); } }; } checkAndAdd(carObj); console.log(objArray); checkAndAdd(bikeObj); console.log(objArray); 

checkAndAdd(carObj);

console.log(objArray);

应该给

[
  {"name":"car","color":"red", "qty":1},
  {"name":"bike","color":"blue","qty":2},
  {"name":"boat","color":"pink", "qty":1},
]

并且checkAndAdd(bikeObj);

console.log(objArray);

应该给

[
  {"name":"car","color":"red", "qty":1},
  {"name":"bike","color":"blue","qty":3},
  {"name":"boat","color":"pink", "qty":1},
]

提前致谢!

如果找到一个增加数量的项目,则需要检查所有对象并退出该功能。

如果没有找到推动对象。

 var objArray = [{ name: "bike", color: "blue", qty: 2 }, { name: "boat", color: "pink", qty: 1 }], carObj = { name: "car", color: "red", qty: 1 }, bikeObj = { name: "bike", color: "blue", qty: 1 }; function checkAndAdd (obj) { for (var i = 0; i < objArray.length; i++) { if (objArray[i].name === obj.name) { objArray[i].qty++; return; // exit loop and function } } objArray.push(obj); } checkAndAdd(carObj); console.log(objArray); checkAndAdd(bikeObj); console.log(objArray); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

您还可以使用find来搜索对象属性。

在推送对象之前使用Object.assign将克隆对象,并且在更改qty时不会更改原始对象(如果添加更多具有相同名称的对象。)

 var objArray = [ {"name":"bike","color":"blue","qty":2}, {"name":"boat","color":"pink", "qty":1}, ]; var carObj = {"name":"car","color":"red","qty":1}; var bikeObj = {"name":"bike","color":"blue","qty":1}; function checkAndAdd(obj) { let o = objArray.find(o => o.name === obj.name); //Find if name exist if (!o) objArray.push(Object.assign({},obj)); //If not exist, push. else o.qty += obj.qty; //If exist, add the qty } checkAndAdd(carObj); console.log(objArray); checkAndAdd(bikeObj); console.log(objArray); 

问题是你在循环内部push() ,而不是一旦找到就立即返回,只在循环外调用push()

更清洁的方法是:

function checkAndAdd(obj) {
    var matchingObj = objArray.find(o => o.name === obj.name);

    if (matchingObj)
        matchingObj.qty++;
    else
        objArray.push(obj);
}

如果对象存在,使用findIndexobjArray中查找。如果确实存在,则更新对象,否则推送新对象

 var objArray = [{ "name": "bike", "color": "blue", "qty": 2 }, { "name": "boat", "color": "pink", "qty": 1 }, ]; var carObj = { "name": "car", "color": "red", "qty": 1 }; var bikeObj = { "name": "bike", "color": "blue", "qty": 1 }; function checkAndAdd(obj) { var x = objArray.findIndex(function(item) { return item.name === obj.name; }); if (x === -1) { objArray.push(obj) } else { objArray[x].qty = objArray[x].qty + obj.qty } } checkAndAdd(carObj); checkAndAdd(bikeObj); console.log(objArray); 

很简单:

function checkAndAdd(obj) {
for (var i=0; i < objArray.length; i++) {
    if (objArray[i]name === obj.name) {
        objArray[i].qty++;
        return
    }
}
objArray.push(obj)
}

说明:

每次对象名称不匹配时,您的功能都在推送。 相反,当此函数匹配名称时,它会增加qty并停止,然后如果循环结束而没有任何匹配,则会推送obj

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM