Javascript 设置数组元素将更改具有相同名称的所有元素

Javascript 设置数组元素将更改具有相同名称的所有元素,javascript,arrays,Javascript,Arrays,这是下面链接的后续帖子。我在那里收到的帮助表明我的代码在JSFIDLE上的工作与预期的一样,所以在创建嵌套数组并将对象推送到它们时,一定有一个我不理解的概念: 这个问题听起来像是一个确切的问题,尽管在javascript中,我有一个问题,但我无法解释如何将正确答案应用到我的用例中: 这个订购UI有点异乎寻常,他们首先选择帐户,然后在选择任何产品之后,必须将其添加到所有帐户 我的数组是JS: runningOrdfers = { "id": 1402846607011, "status": "

这是下面链接的后续帖子。我在那里收到的帮助表明我的代码在JSFIDLE上的工作与预期的一样,所以在创建嵌套数组并将对象推送到它们时,一定有一个我不理解的概念:

这个问题听起来像是一个确切的问题,尽管在javascript中,我有一个问题,但我无法解释如何将正确答案应用到我的用例中:

这个订购UI有点异乎寻常,他们首先选择帐户,然后在选择任何产品之后,必须将其添加到所有帐户

我的数组是JS:

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))