Javascript 设置数组元素将更改具有相同名称的所有元素
这是下面链接的后续帖子。我在那里收到的帮助表明我的代码在JSFIDLE上的工作与预期的一样,所以在创建嵌套数组并将对象推送到它们时,一定有一个我不理解的概念: 这个问题听起来像是一个确切的问题,尽管在javascript中,我有一个问题,但我无法解释如何将正确答案应用到我的用例中: 这个订购UI有点异乎寻常,他们首先选择帐户,然后在选择任何产品之后,必须将其添加到所有帐户 我的数组是JS:Javascript 设置数组元素将更改具有相同名称的所有元素,javascript,arrays,Javascript,Arrays,这是下面链接的后续帖子。我在那里收到的帮助表明我的代码在JSFIDLE上的工作与预期的一样,所以在创建嵌套数组并将对象推送到它们时,一定有一个我不理解的概念: 这个问题听起来像是一个确切的问题,尽管在javascript中,我有一个问题,但我无法解释如何将正确答案应用到我的用例中: 这个订购UI有点异乎寻常,他们首先选择帐户,然后在选择任何产品之后,必须将其添加到所有帐户 我的数组是JS: runningOrdfers = { "id": 1402846607011, "status": "
runningOrdfers = {
"id": 1402846607011,
"status": "unsaved",
"accounts": [
{
"compid": 919759,
"compname": null,
"products": [
{
"BCINUM": "539504",
"ITEMUNIT": "EA",
"ORDERDETAILS": [
{
"SHIPDATEID": "69230",
"SHIPPERIODID": "2096",
"QUANTITY": "1"
},
{
"SHIPDATEID": "69231",
"SHIPPERIODID": "2096",
"QUANTITY": "2"
}
],
"SHIPPINGCOMMENTS": ""
}
]
},
{
"compid": 920001,
"compname": null,
"products": [
{
"BCINUM": "539504",
"ITEMUNIT": "EA",
"ORDERDETAILS": [
{
"SHIPDATEID": "69230",
"SHIPPERIODID": "2096",
"QUANTITY": "1"
},
{
"SHIPDATEID": "69231",
"SHIPPERIODID": "2096",
"QUANTITY": "2"
}
],
"POTEXT": "",
"SHIPPINGCOMMENTS": ""
}
]
}
]
下面是我如何创建对象并将其附加到数组中。首先,创建一个新订单:
var runningOrders = {};
function createNewOrder(event) {
var uniqueID = uniqueIdentifier();
var accounts = [];
var products = [];
runningOrders.id = uniqueID;
runningOrders.status = "unsaved";
runningOrders["accounts"] = accounts;
runningOrders.accounts["products"] = products;
selectAccountsTab(event);
}
然后将帐户添加到订单中:
function addAccountToOrder(compID) {
getAccount(compID);
var thisAccount = {};
var n = savedAccountByCompID.length;
for (var i = 0; i < n; i++) {
var accountListObject = savedAccountByCompID[i];
thisAccount.compid = +accountListObject.COMPID;
thisAccount.compname = +accountListObject.COMPNAME;
thisAccount.products = [];
runningOrders.accounts.push(thisAccount);
}
}
函数addAccountToOrder(compID){
获取帐户(compID);
var thisAccount={};
var n=savedAccountByCompID.length;
对于(变量i=0;i
最后,按照刚才创建的顺序将产品添加到帐户:
function setProductSelected(bcinum){
var thisProductSelected = {};
var thisProduct = "bcinum" + bcinum;
var thisProductData = productData[thisProduct];
thisProductSelected.BCINUM = thisProductData.BCINUM;
thisProductSelected.ITEMUNIT = thisProductData.ITEMUNIT;
thisProductSelected.ORDERDETAILS = [];
thisOrderDetails = {
SHIPDATEID: "69230",
SHIPPERIODID: "2096",
QUANTITY: ""
};
thisProductSelected.ORDERDETAILS.push(thisOrderDetails);
thisOrderDetails = {
SHIPDATEID: "69231",
SHIPPERIODID: "2096",
QUANTITY: ""
};
thisProductSelected.ORDERDETAILS.push(thisOrderDetails);
var a = runningOrders.accounts.length;
for (var ii = 0; ii < a; ii++) {
currAccount = runningOrders.accounts[ii]; //possible problem? Loping over accounts and pushing same object?
currAccount.products.push(thisProductSelected);
}
}
函数setProductSelected(bcinum){
var thisProductSelected={};
var thisProduct=“bcinum”+bcinum;
var thisProductData=productData[thisProduct];
thisProductSelected.BCINUM=thisProductData.BCINUM;
thisProductSelected.ITEMUNIT=thisProductData.ITEMUNIT;
thisProductSelected.ORDERDETAILS=[];
此订单详细信息={
SHIPDATEID:“69230”,
SHIPPERIODID:“2096”,
数量:“
};
thisProductSelected.ORDERDETAILS.push(thisOrderDetails);
此订单详细信息={
SHIPDATEID:“69231”,
SHIPPERIODID:“2096”,
数量:“
};
thisProductSelected.ORDERDETAILS.push(thisOrderDetails);
var a=runningOrders.accounts.length;
对于(var ii=0;ii
我的函数用于迭代和更新我导航到的索引的元素:
function updateComments(compID,bcinum,comment) {
var accounts = runningOrders.accounts;
var n = accounts.length;
for (i = 0; i < n; i++) {
if (accounts[i].compid == compID) {
var p = accounts[i].products.length;
for (ii = 0; ii < p; ii++) {
if (accounts[i].products[ii].BCINUM == bcinum) {
accounts[i].products[ii].SHIPPINGCOMMENTS = comment;
}
}
}
}
}
函数更新注释(compID、bcinum、comment){
var账户=runningOrders.accounts;
var n=账户长度;
对于(i=0;i
当我调用我的更新函数时,它会更新所有索引位置的SHIPPINGCOMMENTS,而不仅仅是我想要更新的位置,它基于compID:
更新建议(919759539504,'更早') 无论可读性问题如何,这似乎都能按中所示的设计工作。似乎还有别的事情在发生 这是一个很好的例子,说明了不变性是如何起到很大作用的。围绕不可变的数据结构设计代码可以减轻复杂性和真相所在的混乱。不幸的是,在JavaScript中(默认情况下),对象是通过引用而不是通过值来管理的,因此语言本身不直接支持不可变对象。较新版本(ECMAScript 5)支持
对象.freeze
,但在较旧/功能不正常的浏览器中,需要使用polyfill
为了管理深度嵌套的数据结构的复杂性,它可以帮助将数据封装在自定义对象中(在经典的面向对象设计中定义的对象,尽管在JavaScript中这将是一个原型对象)。但是,这超出了原始问题的范围(请参阅上的这篇博文)。这段代码几乎无法阅读,这是什么。。。vars?您是否试图避免对象。原型?为什么?有很多例子似乎与这个问题无关。您能否提供一个其他人可以调试的jsbin.com或jsfiddle.net示例?最后,考虑使用FACHAC/MAP函数,嵌套for循环很难用这个用法示例来理解。谢谢@ SukIMA。我显然不是一个经验丰富的JS开发人员,我会研究你的建议。jsbin和JSFIDLE从上一篇文章中获得了预期的效果,并建议我提供更多的代码。由于问题似乎在于如何创建和填充这些数据结构,因此我提供了附加代码。所以简单的问题是当我运行
updateComments(919759539504,'leaver')
,位于帐户[0]的两个索引。产品[0]。SHIPPINGCOMMENTS=leaver
和帐户[1]。产品[0]。SHIPPINGCOMMENTS=leaver
得到更新,这是意外的。如果两个帐户上的产品引用同一对象,则这两个索引都将被更新。JavaScript再次通过引用传递对象。您的创建代码可能是重用对象,而不是创建新对象,因此您认为您有两个对象,但实际上您有一个,这就是为什么它们似乎都发生了变化。谢谢@Sukima。在经历并实现了对象和闭包之后,我仍然有同样的问题。在我上面列出的代码中,有几行我原本认为是罪魁祸首:currcount=runningOrders.accounts[ii]//可能的问题?翻开账户,推同一个目标?currAccount.products.push(已选择此产品)
我的临时解决方案是使用JSON.parse复制深嵌套对象,如下所示:var thisInstance=“data”+ii;var thisInstance=JSON.parse(JSON.stringify(thisProductSelected))在我们部门,当我们有人想出这样的解决办法时