这是JSON数据的一部分我试图制作一个数组并将它们放入Google电子表格中,
这是m部分
"m":{
"414" : {"a":123},
"47279":{"a":1234 },
"463306":{"a":12345}}
这是z部分
"z":{"3270":
"414" : {"d":{"0":{"p":500}}},
"47279":{"d":{"0":{"p":700}}}}
这是我正在使用的JS代码
var Uid = Object.getOwnPropertyNames(doc1.m);
for (var lp2 = 0; lp2 < Uid.length; lp2++) {
var Uid1 = Uid[lp2];
var TotalD = Math.round(doc1.m[Uid[lp2]].a);
testUF.push([Uid1, TotalD]);
}
//Total Obelisk Defense
for (var lp1 = 0; lp1 < testUF.length; lp1++) {
var lp35id = Object.getOwnPropertyNames(doc1.z["3270"]).length;
var ob35id = Object.getOwnPropertyNames(doc1.z["3270"]);
var ob35 = "3270";
for (var lp3 = 0; lp3 < lp35id; lp3++) {
if (ob35id[lp3] === testUF[lp1][0]) {
if (typeof doc1.z[ob35][ob35id[lp3]] !== 'undefined' && doc1.z[ob35][ob35id[lp3]] !== null && doc1.z[ob35][ob35id[lp3]] !== "") {
var ob35D = (doc1.z[ob35][ob35id[lp3]].d["0"].p);
} else {
var ob35D = "0";
}
}
var ob35TD = ob35D;
}
var obTD = ob35TD;
testUF[lp1][2] = Math.round(obTD);
}
我得到的结果
+--------+--------+------+
| Uid1 | TotalD | obTD |
+--------+--------+------+
| 414 | 123 | 500 |
+--------+--------+------+
| 42729 | 1234 | 700 |
+--------+--------+------+
| 463306 | 12345 | 700 | <<-- This is the Problem, The obTD Value should be 0
+--------+--------+------+
所以问题出在我的结果中,当“m”对象中不存在Uid时,你可以看到obTD值与前一个值重复, 但如果Uid不存在于“z”:{“3270”对象中,我希望它为0。
答案 0 :(得分:0)
你已经碰到了你对变量范围没有预料到的东西。您打算在最内层ob35D
循环的范围内声明for
,将undefined
留在其他地方,但JavaScript只有函数级范围。由于您没有在您发布的内容中声明任何功能,因此您的所有变量都是代码的此部分的全局变量。
因此,当您浏览lp1
和lp3
循环时,(ob35id[lp3] === testUF[lp1][0])
适用于Uids 414
和42729
并设置ob35D
到500
然后700
。在最后的lp1
循环中,lp3
循环永远找不到463306
的匹配,因此ob35D
仍为700
并通过ob35TD
传播obTD
列表中ob35D
(实际上不需要testUF
,因为ob35D = 0
随处可访问)。
最简单的解决方法是在每个lp1
循环的开头设置{{1}}。当没有Uid匹配时,这会为您提供所需的默认值。
我还会在reading up上推荐JavaScript variable scope,因为通过更好地了解它,您可以大大简化代码。