函数中的If语句会创建其他对象

If statement in function creates additional objects

本文关键字:创建 其他 对象 语句 If 函数      更新时间:2023-09-26

函数应该将对象添加到对象数组中的嵌套数组(Items)中,并检查对象是否已经存在。如果它确实存在,它只是增加数量,否则它应该添加一个新项目。但是,一旦嵌套数组(Items)有了第二个对象,即使条件(array[i].Items[x].description==description)应返回true,它也会创建新对象,而不是递增。description和_quantity值由用户输入传递。

var array = [];
AddCustomItem = function (_title, _description) {
if (array.length > 0) {
    for (var i in array) {
        if (array[i].RoomName === "Other") {                        
            for (var x in array[i].Items) {
                if (array[i].Items[x].description == _description) {
                    array[i].Items[x].quantity += parseInt(_quantity);
                    break;
                } else {
                    array[i].Items.push({
                        category : "Other",
                        description : _description,
                        quantity : parseInt(_quantity)
                    });
                    break;
                };
            };              
            break;  
        };
    };
} else  {
    array.push({
        RoomName : "Other",
        Items : [{
                category : "Other",
                description : _description,
                quantity : parseInt(_quantity)
            }
        ]
    });
};
var result = array;
return result;

};

如果数组的第一个条目不匹配,则进行添加,并且不查看数组中的任何其他条目,因为您在ifelse块中都从数组中break;。所以循环永远不会循环。相反,搜索整个数组,然后只在找不到条目的情况下添加。

这是一个最小更改版本:

var found;
for (var x in array[i].Items) {
    if (array[i].Items[x].description == _description) {
        found = array[i].Items[x];
        break;
    }
}
if (found) {
    found.quantity += parseInt(_quantity);
} else {
    array[i].Items.push({
        category : "Other",
        description : _description,
        quantity : parseInt(_quantity)
    });
}

但我可能会使用Array#find(你可能需要在旧的浏览器上填充它):

var found = array[i].Items.find(function(item) { return item.description == _description; });
if (found) {
    found.quantity += parseInt(_quantity);
} else {
    array[i].Items.push({
        category : "Other",
        description : _description,
        quantity : parseInt(_quantity)
    });
}    

旁注1:for-in通常不是遍历数组的好方法。这个答案描述了你这样做的各种选择。

旁注2:连接到iffor等的块之后不需要;。该块已由}终止。

但是,一旦嵌套数组(Items)有了第二个对象,即使条件(array[i].Items[x].description==description)应返回true,它也会创建新对象,而不是递增。

这是因为在外部for之后有break,并且并没有第二次迭代,它只是在else语句中添加元素。

即使条件为(array[i].items[x].description == _description )应返回true

这是因为这个条件不会总是返回true。因为数组中还会有其他项目。

按照你的逻辑,如果第一场比赛没有发生,它就会去别的地方。

你需要做

     var found = false;
     for (var x in array[i].Items) 
     {
            if (array[i].Items[x].description == _description) {
                array[i].Items[x].quantity += parseInt(_quantity);
                found = true;
                break;
            }
     }
     if (!found) {
                array[i].Items.push({
                    category : "Other",
                    description : _description,
                    quantity : parseInt(_quantity)
                });
                break;
     }     

您的问题是,在第一次通过内部循环时,您总是更新数量或添加新项目,然后脱离循环。您需要让它在所有项目中循环,直到找到匹配项,或者项目用完为止。然后,如果没有找到匹配项,则添加一个项目。请参阅下面的代码。它使用布尔变量来指示是否找到匹配项。

var found = false;
for (var x in array[i].Items) {
  if (array[i].Items[x].description == _description) {
    array[i].Items[x].quantity += parseInt(_quantity);
    found = true;
    break;
  }
}
if (!found) {
  array[i].Items.push({
    category: "Other",
    description: _description,
    quantity: parseInt(_quantity)
  });
}

奖励提示:

  • for循环和if else块在结束}之后不需要分号
  • AddCustomItem函数的声明将是一个全局变量,因为您没有用var声明它(除非您之前已经用var声明了该变量)