在将任何内容分配给它之前,对象具有值

时间:2017-01-08 19:56:04

标签: javascript json object

我不确定如何使问题更精确。

我有这张桌子。如您所见,每行中都有一些复选框,checked值在多维对象中分配,结构如下所示。

正在从JSON文件加载checked值,当您按下save时,它会创建一个新对象,该对象假设具有相同的相同结构但具有更新的值,然后覆盖JSON文件。

代码:

function saveRecruit() {
        var obj = {};
        var specsObj = {};
        var classesObj = {};
        var rowCount = $("#classTable tr").length;
        var columnCount;
        var jsonChar;
        var jsonSpec;
        var jsonSpecRC;
        var jsonString;
        console.log("------ LOGGING FIRST: specsObj ------");
        console.log(specsObj);
        for(x = 1;x<=rowCount;x++)
        {
            jsonChar = $("#classTable tr:nth-child(" + x + ") td:nth-child(1)").text();
            columnCount = $("#classTable tr:nth-child(" + x + ")").children().length;

            for(y = 2;y<=columnCount;y++)
            {
                jsonSpec = $("#classTable tr:nth-child(" + x + ") td:nth-child(" + y + ")").text();
                jsonSpecRC = $("#classTable tr:nth-child(" + x + ") td:nth-child(" + y + ") input:nth-child(2)")[0].checked;
                console.log("Setting " + jsonSpec + " to " + jsonSpecRC + " in specsObj");
                console.log("X: " + x + " - Y: " + y);
                specsObj[jsonSpec] = jsonSpecRC;
            };
            obj[jsonChar] = specsObj;
            console.log(jsonChar + ": specsObj");
            console.log(specsObj);
        };
        console.log("Logging obj");
        console.log(obj);
        console.log(jsonString);

        $("#jsonInput").val(jsonString);
        return false;
    };

它检查每一行,然后在两个for循环中将每个列值分配给该行。然而,这里出现的问题是过去几个小时一直困扰着我。出于某种原因,所有checked值都分配给每个“第1层”对象,如下图所示。我真的不明白,显然,德鲁伊对象应该只包含rc,平衡,野性,守护和恢复的值。

我希望你们能帮助我解决这个问题,并随时告诉我,我是否对某些事情一无所知。提前谢谢!

编辑:忘记包含与标题相关的内容。我不确定,但是在运行for循环之前,所有值都已分配。

function saveRecruit() {
        var obj = {};
        var specsObj = {};
        var classesObj = {};
        var rowCount = $("#classTable tr").length;
        var columnCount;
        var jsonChar;
        var jsonSpec;
        var jsonSpecRC;
        var jsonString;
        console.log("------ LOGGING FIRST: specsObj ------");
        console.log(specsObj);
...

在分配任何值之前,正在声明并记录变量specsObj。您可以在下图中看到日志:

1 个答案:

答案 0 :(得分:1)

问题是在你的循环中你不断添加specsObj而不重置每一行。

以下是您的代码,其中添加了一行来解决问题

for(x = 1;x<=rowCount;x++)
    {
        jsonChar = $("#classTable tr:nth-child(" + x + ") td:nth-child(1)").text();
        columnCount = $("#classTable tr:nth-child(" + x + ")").children().length;

        specsObj = {}; // add this to reset the specsObj for each character

        for(y = 2;y<=columnCount;y++)
        {
            jsonSpec = $("#classTable tr:nth-child(" + x + ") td:nth-child(" + y + ")").text();
            jsonSpecRC = $("#classTable tr:nth-child(" + x + ") td:nth-child(" + y + ") input:nth-child(2)")[0].checked;
            console.log("Setting " + jsonSpec + " to " + jsonSpecRC + " in specsObj");
            console.log("X: " + x + " - Y: " + y);
            specsObj[jsonSpec] = jsonSpecRC;
        };
        obj[jsonChar] = specsObj;
        console.log(jsonChar + ": specsObj");
        console.log(specsObj);
    };