该函数应该将对象添加到对象数组中的嵌套数组(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;
};
答案 0 :(得分:1)
如果数组的第一个条目不匹配,并且没有查看数组中的任何其他条目,那么您将添加,因为两个数组都在break;
之外if
和else
块。所以循环永远不会循环。而是搜索整个数组,然后只有在找不到该条目时才添加。
这是一个最小变化版本:
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:附加到if
,for
等的块后面不需要;
。该块已被}
终止。
答案 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
声明了变量)