如果函数中的语句创建其他对象

时间:2016-04-20 12:03:47

标签: javascript arrays object

该函数应该将对象添加到对象数组中的嵌套数组(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;

};

4 个答案:

答案 0 :(得分:1)

如果数组的第一个条目不匹配,并且没有查看数组中的任何其他条目,那么您将添加,因为两个数组都在break;之外ifelse块。所以循环永远不会循环。而是搜索整个数组,然后只有在找不到该条目时才添加。

这是一个最小变化版本:

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通常不是循环数组的好方法。 This answer描述了您这样做的各种选择。

附注2:附加到iffor等的块后面不需要;。该块已被}终止。

答案 1 :(得分:1)

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

那是因为你在外部之后有中断而且没有第二次迭代它只是在else语句中添加了元素。

答案 2 :(得分:0)

  

它创建新对象而不是递增,即使条件   (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;
     }     

答案 3 :(得分:0)

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

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声明了变量)