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

Javascript-检查对象数组中是否存在对象并更新数量,javascript,Javascript,我有一个数组objArray。我想创建一个函数,以便它检查是否有另一个对象具有相同的名称键。如果存在,它将在数量键中添加+1。如果对象不存在,它会将新对象推送到数组中 var objArray=[ {“名称”:“自行车”,“颜色”:“蓝色”,“数量”:2}, {“名称”:“船”,“颜色”:“粉色”,“数量”:1}, ]; var carObj={“名称”:“汽车”,“颜色”:“红色”,“数量”:1}; var bikeObj={“名称”:“自行车”,“颜色”:“蓝色”,“数量”:1}; 功能检

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

var objArray=[
{“名称”:“自行车”,“颜色”:“蓝色”,“数量”:2},
{“名称”:“船”,“颜色”:“粉色”,“数量”:1},
];
var carObj={“名称”:“汽车”,“颜色”:“红色”,“数量”:1};
var bikeObj={“名称”:“自行车”,“颜色”:“蓝色”,“数量”:1};
功能检查和添加(obj){
for(var i=0;i控制台日志(objArray)您需要检查所有对象,如果发现一项用于增加数量,则退出该函数

如果找不到,则推动对象

var objArray=[{name:“bike”,color:“blue”,qty:2},{name:“boat”,color:“pink”,qty:1}],
carObj={名称:“汽车”,颜色:“红色”,数量:1},
bikeObj={名称:“自行车”,颜色:“蓝色”,数量:1};
功能检查和添加(obj){
for(var i=0;i

。作为控制台包装{max height:100%!important;top:0;}
您还可以使用
find
搜索对象属性

在推送对象之前使用
对象。分配
将克隆对象,并且在更改
数量时不会更改原始对象(如果添加更多同名对象)

var objArray=[
{“名称”:“自行车”,“颜色”:“蓝色”,“数量”:2},
{“名称”:“船”,“颜色”:“粉色”,“数量”:1},
];
var carObj={“名称”:“汽车”,“颜色”:“红色”,“数量”:1};
var bikeObj={“名称”:“自行车”,“颜色”:“蓝色”,“数量”:1};
功能检查和添加(obj){
让o=objArray.find(o=>o.name==obj.name);//如果名称存在,则查找
if(!o)objArray.push(Object.assign({},obj));//如果不存在,则push。
否则o.qty+=obj.qty;//如果存在,则添加数量
}
checkAndAdd(carObj);
控制台日志(objArray);
checkAndAdd(bikeObj);
控制台日志(objArray)用于在objArray中查找对象是否存在。如果存在,则更新对象,否则推送新对象

var objArray=[{
“名称”:“自行车”,
“颜色”:“蓝色”,
“数量”:2
},
{
“名称”:“船”,
“颜色”:“粉色”,
“数量”:1
},
];
var carObj={
“名称”:“汽车”,
“颜色”:“红色”,
“数量”:1
};
变量bikeObj={
“名称”:“自行车”,
“颜色”:“蓝色”,
“数量”:1
};
功能检查和添加(obj){
var x=objArray.findIndex(函数(项){
返回item.name==obj.name;
});
如果(x==-1){
objArray.push(obj)
}否则{
objArray[x]。数量=objArray[x]。数量+obj.qty
}
}
checkAndAdd(carObj);
checkAndAdd(bikeObj);

控制台日志(objArray)问题在于,您在循环内部调用了
push()
,而不是在找到后立即返回,只在循环外部调用
push()

更清洁的办法是:

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

    if (matchingObj)
        matchingObj.qty++;
    else
        objArray.push(obj);
}
很简单:

function checkAndAdd(obj) {
for (var i=0; i < objArray.length; i++) {
    if (objArray[i]name === obj.name) {
        objArray[i].qty++;
        return
    }
}
objArray.push(obj)
}
功能检查和添加(obj){
for(var i=0;i
说明:
每次对象名称不匹配时,您的函数都在推送。相反,当这个函数有一个匹配的名称时,它会增加
数量并停止,然后如果循环结束时没有任何匹配,它会推送
obj

@D.Pardal。实际上,我花了几分钟的时间来取消这一点,因为OP没有明确说明。似乎当推一辆车时,数量最终是
2
,而不是
1
,就是这样!我将把它标记为正确的,因为它是我的代码中最简单的一个。谢谢