【问题标题】:JSON to JS Array, Non Existent Object Duplicates Previous Object ValuesJSON 到 JS 数组,不存在的对象重复以前的对象值
【发布时间】:2015-10-13 21:49:47
【问题描述】:

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

【问题讨论】:

    标签: javascript arrays json google-sheets


    【解决方案1】:

    您在使用变量作用域时遇到了意想不到的事情。您打算在最里面的for 循环的范围内声明ob35D,将undefined 留在其他地方,但JavaScript 仅具有函数级范围。由于您没有在发布的内容中声明任何函数,因此您的所有变量对于您的代码的这一部分实际上都是全局的。

    因此,当您运行 lp1lp3 循环时,(ob35id[lp3] === testUF[lp1][0]) 对于 Uid 41442729 为 true,并将 ob35D 设置为 500 然后 700。在最后的lp1 循环中,lp3 循环永远不会找到与463306 匹配的对象,因此ob35D 仍然是700 并通过ob35TDobTD 传播(这实际上是不必要的,因为ob35D随处可见)进入您的testUF 列表。

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

    我还建议在JavaScript variable scope 上使用reading up,因为更好地理解它可以显着简化代码。

    【讨论】:

    • 非常感谢,它解决了我的问题,另外还让我了解了我收到该错误的原因和原因。非常感谢(:
    猜你喜欢
    • 2017-03-27
    • 2020-10-04
    • 2018-05-11
    • 2019-04-28
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 2020-03-02
    • 2014-01-09
    相关资源
    最近更新 更多