JSON到JS数组,不存在的对象复制以前的对象值

时间:2015-10-13 21:49:48

标签: javascript arrays json google-sheets

这是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。

1 个答案:

答案 0 :(得分:0)

你已经碰到了你对变量范围没有预料到的东西。您打算在最内层ob35D循环的范围内声明for,将undefined留在其他地方,但JavaScript只有函数级范围。由于您没有在您发布的内容中声明任何功能,因此您的所有变量都是代码的此部分的全局变量。

因此,当您浏览lp1lp3循环时,(ob35id[lp3] === testUF[lp1][0])适用于Uids 41442729并设置ob35D500然后700。在最后的lp1循环中,lp3循环永远找不到463306的匹配,因此ob35D仍为700并通过ob35TD传播obTD列表中ob35D(实际上不需要testUF,因为ob35D = 0随处可访问)。

最简单的解决方法是在每个lp1循环的开头设置{{1}}。当没有Uid匹配时,这会为您提供所需的默认值。

我还会在reading up上推荐JavaScript variable scope,因为通过更好地了解它,您可以大大简化代码。