Javascript 在JSON中更新elemint将更新所有

Javascript 在JSON中更新elemint将更新所有,javascript,arrays,json,Javascript,Arrays,Json,我解析了一个JSON对象,并尝试向下导航到SHIPPINGCOMMENTS并对其进行更新,但当我这样做时,它会用该名称更新所有单元格,而不仅仅是一个 { "id": 1402846607011, "status": "unsaved", "accounts": [ { "compid": 919759, "compname": null, "products": [

我解析了一个JSON对象,并尝试向下导航到SHIPPINGCOMMENTS并对其进行更新,但当我这样做时,它会用该名称更新所有单元格,而不仅仅是一个

{
    "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": "sooner"
                }
            ]
        },
        {
            "compid": 920001,
            "compname": null,
            "products": [
                {
                    "BCINUM": "539504",
                    "ITEMUNIT": "EA",
                    "ORDERDETAILS": [
                        {
                            "SHIPDATEID": "69230",
                            "SHIPPERIODID": "2096",
                            "QUANTITY": "1"
                        },
                        {
                            "SHIPDATEID": "69231",
                            "SHIPPERIODID": "2096",
                            "QUANTITY": "2"
                        }
                    ],
                    "POTEXT": "",
                    "SHIPPINGCOMMENTS": "sooner"
                }
            ]
        }
    ]
}
这是我的代码,我正在循环使用它:

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;
                }   
            }       
        }
    }
}
两个潜在问题:

  • 在计算n时,实际上并没有计算acconts数组的大小?(JSON)对象的名称是什么
  • 在示例函数调用中,将两个对象中的名称更改为已定义的名称。这是个错误吗
  • 这段代码在node.js中适用于我:

    function updateComments(compID,bcinum,comment) {
      var n = accounts.accounts.length;
      console.log(n);
      console.log(accounts['accounts'][0].products);
      console.log(accounts['accounts'][1].products);
      for (i = 0; i < n; i++) {
        console.log('testing ', i, accounts.accounts[i].compid)
        if (accounts.accounts[i].compid == compID) {
          var p = accounts.accounts[i].products.length;
          console.log('Found compid', i, compID);
          for (ii = 0; ii < p; ii++) {
            if (accounts.accounts[i].products[ii].BCINUM == bcinum) {
              console.log('Found bcinum', ii, bcinum)
              accounts.accounts[i].products[ii].SHIPPINGCOMMENTS = comment;
            }
          }
        }
      }
      console.log(accounts['accounts'][0].products);
      console.log(accounts['accounts'][1].products);
    }
    
    accounts = {
    "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": "sooner"
                }
            ]
        },
        {
            "compid": 920001,
            "compname": null,
            "products": [
                {
                    "BCINUM": "539504",
                    "ITEMUNIT": "EA",
                    "ORDERDETAILS": [
                        {
                            "SHIPDATEID": "69230",
                            "SHIPPERIODID": "2096",
                            "QUANTITY": "1"
                        },
                        {
                            "SHIPDATEID": "69231",
                            "SHIPPERIODID": "2096",
                            "QUANTITY": "2"
                        }
                    ],
                    "POTEXT": "",
                    "SHIPPINGCOMMENTS": "sooner"
                }
            ]
        }
    ]
    }
    
    函数更新注释(compID、bcinum、comment){
    var n=accounts.accounts.length;
    控制台日志(n);
    console.log(帐户['accounts'][0]。产品);
    console.log(accounts['accounts'][1].products);
    对于(i=0;i
    您的代码与您描述的完全不同。你的代码对我有用。仅更新compid 919759和BCINUM 539504下的SHIPPINGCOMMENTS。也许我们需要更多地查看您的代码。您的代码能够实现您描述的功能的唯一方法是,如果
    产品
    数组中引用的所有对象都是对同一对象的引用。在JS中分配时不会复制对象。但是,你说这是JSON,JSON不翻译对象引用,所以如果是这样,你就排除了一些非常相关的代码。你的对的人,它的工作原理与我在JSFIDLE上的示例中所期望的完全一样。因此,我创建这些数据结构的方式肯定有问题。虽然我说的是JSON,但它是手动构造的JS数组和哈希表。不知道如何在此线程中发布附加代码。我只是从runningOrders={}开始;然后运行orders.accounts=[];runningOrders.accounts.products=[];然后我创建对象并将它们推送到accounts and products数组。虽然我分别创建了这些对象,但它们似乎是一个整体。我所做的任何更新都会发生这种情况。我在一个元素中进行的更新使用相同的键对所有元素进行更新。1。JSON对象的名称是runningOrders,因此我将您对“accounts.accounts”的引用更改为“runningOrders.accounts”,并使用了您的函数,得到了相同的结果。2.这听起来像是我遇到的问题。我不想更改这两个对象中的key SHIPPINGCOMMENTS值,只想更改导航到的对象中的key SHIPPINGCOMMENTS值。这个JSON对象快照是在我将第一个更新为“更快”之后拍摄的。@Dan:他的第2点只是观察到,当所有值都已设置为
    “更快”
    时,您的问题看起来好像是在试图将值设置为
    “更快”
    。您的问题没有说明提供的JSON标记表示函数调用后的快照。@Dan:如果您添加与我相同的打印,输出结果是什么?@cookie monster,谢谢,我现在明白了。我没有说明这是更新后的快照,并显示不希望出现的行为。@civing-当我将“accounts.accounts”替换为“runningOrders.accounts”并对第一个帐户进行更新时,runningOrders['accounts'][0]。products[0]。SHIPPINGCOMMENTS和runningOrders['accounts'][1]。products[0]。SHIPPINGCOMMENTS更新为更快。
    function updateComments(compID,bcinum,comment) {
      var n = accounts.accounts.length;
      console.log(n);
      console.log(accounts['accounts'][0].products);
      console.log(accounts['accounts'][1].products);
      for (i = 0; i < n; i++) {
        console.log('testing ', i, accounts.accounts[i].compid)
        if (accounts.accounts[i].compid == compID) {
          var p = accounts.accounts[i].products.length;
          console.log('Found compid', i, compID);
          for (ii = 0; ii < p; ii++) {
            if (accounts.accounts[i].products[ii].BCINUM == bcinum) {
              console.log('Found bcinum', ii, bcinum)
              accounts.accounts[i].products[ii].SHIPPINGCOMMENTS = comment;
            }
          }
        }
      }
      console.log(accounts['accounts'][0].products);
      console.log(accounts['accounts'][1].products);
    }
    
    accounts = {
    "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": "sooner"
                }
            ]
        },
        {
            "compid": 920001,
            "compname": null,
            "products": [
                {
                    "BCINUM": "539504",
                    "ITEMUNIT": "EA",
                    "ORDERDETAILS": [
                        {
                            "SHIPDATEID": "69230",
                            "SHIPPERIODID": "2096",
                            "QUANTITY": "1"
                        },
                        {
                            "SHIPDATEID": "69231",
                            "SHIPPERIODID": "2096",
                            "QUANTITY": "2"
                        }
                    ],
                    "POTEXT": "",
                    "SHIPPINGCOMMENTS": "sooner"
                }
            ]
        }
    ]
    }