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
,就是这样!我将把它标记为正确的,因为它是我的代码中最简单的一个。谢谢