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