函数中的If语句会创建其他对象
If statement in function creates additional objects
函数应该将对象添加到对象数组中的嵌套数组(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;
};
如果数组的第一个条目不匹配,则进行添加,并且不查看数组中的任何其他条目,因为您在if
和else
块中都从数组中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:连接到if
、for
等的块之后不需要;
。该块已由}
终止。
但是,一旦嵌套数组(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
声明了该变量)
- 创建要在其他函数中使用的全局变量
- 使用Javascript创建的Cookie在C#代码中不可访问..任何原因或其他选择
- 使用其他页面上表单的文本创建链接
- Javascript创建函数,以便在其他函数之间共享变量
- 如何为javascript创建自定义标签?或者这是我不知道的其他事情吗;我不知道
- Firefox扩展开发:如何在内容脚本中创建一个全局函数,以便其他加载的脚本文件可以访问它
- 上次创建的DIV高于其他DIV
- 在页面加载时创建/设置活动的默认链接,但在单击其他链接时删除活动链接
- 函数中的If语句会创建其他对象
- 我创建了一个下拉列表,以及如何显示所选项目的其他列数据
- 关闭-“阻止此页面创建其他对话框”
- 如何创建一个链接,该链接使用相应的参数打开到其他链接
- 如何在Javascript中创建一个调用其他函数的函数
- Chrome 撤消“阻止此页面创建其他对话框”的操作
- 如何制作弹出窗口以创建其他弹出窗口
- 嵌套类定义,而不创建其他全局对象
- 在angular控制器中使用$scope值来创建其他作用域值
- 防止此页创建其他对话框
- 创建表单以根据从onchange from下拉框中选择的内容创建其他输入字段
- 在JQuery中创建其他元素