0

我是 JavaScript 新手,我想要一个这样的 JSON 结构:

JSON

{
    "ObjektId":["1","11","111","1111"],
    "Selected": [
        {
            "SelectedObjektId":"555",
            "SelectedObjektValues":["Test1","Test2","Test3"]
        },
        {
            "SelectedObjektId":"112555",
            "SelectedObjektvalues":["11Test1","22Test2","22Test3"]
        }//,and many others 
    ]
}

JS

var json = new Object();
json.ObjektId = new Array("1", "11", "111", "1111");
json.Selected = new Array();
//console.log(JSON.stringify(json));
var util = new Object();
util.SelectedObjektId = "555";
util.SelectedObjektValues = new Array("Test1", "Test2", "Test3");

json.Selected.push(util);
//console.log(JSON.stringify(json));
util.SelectedObjektId = "112555";
util.SelectedObjektValues = new Array("11Test1", "22Test2", "22Test3");

json.Selected.push(util);

我已经建立了这个,但现在我的问题。我通过一个函数动态生成它,JSON 模型是一个全局变量。现在,当我调用该函数两次等时,JSON 中包含旧值和新值。但我只想要新的 JSON 值。我尝试了几件事,但没有任何效果。

function getJSONObjektList() {

    //HauptJSONknoten
    var jsonObjekt = {};
    jsonObjekt.ObjektId = [];
    jsonObjekt.Selected = [];
    //HilfsJSONknoten
    var utilJSONObjekt = {};
    utilJSONObjekt.SelectedObjektId;
    utilJSONObjekt.SelectedObjektWerte = [];

    doc = XYZ.GetCurrentDocument();
    doc.GetAllObjects(function (objects) {
        for (var i = 0; i < objects.length; i++) {
            var obj = objects[i];
            var id = obj.id;
            var caption = obj.caption;
            var type = obj.type;
            var my = obj.my;
            console.log("[obj:" + obj + " id:" + id + " caption:" + caption + " type:" + type + " my: " + my + "]");

            //liste alle verfuegbaren  Objekte auf 
            jsonObjekt.ObjektId.push(id);

            if (type === "Statusbox") {
                doc.GetObject(id, function () {
                    var statusboxInhalt = this.Data.Rows;

                    for (var j = 0; j < statusboxInhalt.length; j++) {
                        var inhalt = statusboxInhalt[j];
                        console.log("Name: " + inhalt[0].text + " Wert: " + inhalt[2].text);

                        utilJSONObjekt.SelectedObjektId = inhalt[0].text;

                        var valAr = inhalt[2].text.split(",");
                        for (var k = 0; k < valAr.length; k++) {
                            utilJSONObjekt.SelectedObjektWerte.push($.trim(valAr[k]));
                        }
                        jsonObjekt.Selected.push(utilJSONObjekt);
                    }
                });
            }
        }
    });
    $('#txtboxQv').append(JSON.stringify(jsonObjekt));
    return jsonObjekt;
}
4

1 回答 1

0

在 JavaScript 中,对象是通过引用传递的。这意味着您的 util 对象仍然引用您推送到 json 对象中的那个。

基本上,您需要创建一个新对象。

这是您的代码的更新版本,写得更习惯了:

var json = {};
json.ObjektId = ["1", "11", "111", "1111"];
json.Selected = [];
//console.log(JSON.stringify(json));

var util = {};
util.SelectedObjektId = "555";
util.SelectedObjektValues = ["Test1", "Test2", "Test3"];

json.Selected.push(util);
//console.log(JSON.stringify(json));

util = {}; // this is the key, you need to create a new Object
util.SelectedObjektId = "112555";
util.SelectedObjektValues = ["11Test1", "22Test2", "22Test3"];

json.Selected.push(util);

我所做的语法更改指南:

  • [a, b, ...] - new Array(a, b, ...) 的语法糖;
  • {} - new Object() 的语法糖;

这将产生以下 JSON:

{
  "ObjektId": [
    "1",
    "11",
    "111",
    "1111"
  ],
  "Selected": [
    {
      "SelectedObjektId": "555",
      "SelectedObjektValues": [
        "Test1",
        "Test2",
        "Test3"
      ]
    },
    {
      "SelectedObjektId": "112555",
      "SelectedObjektValues": [
        "11Test1",
        "22Test2",
        "22Test3"
      ]
    }
  ]
}

更新:

这是我对您期望的最佳猜测:

function getJSONObjektList() {
    //HauptJSONknoten
    var jsonObjekt = {};
    jsonObjekt.ObjektId = [];
    jsonObjekt.Selected = [];
    //HilfsJSONknoten

    doc = XYZ.GetCurrentDocument();
    doc.GetAllObjects(function (objects) {
        for (var i = 0; i < objects.length; i++) {
            var obj = objects[i];
            var id = obj.id;
            var caption = obj.caption;
            var type = obj.type;
            var my = obj.my;
            console.log("[obj:" + obj + " id:" + id + " caption:" + caption + " type:" + type + " my: " + my + "]");

            //liste alle verfuegbaren  Objekte auf 
            jsonObjekt.ObjektId.push(id);

            if (type === "Statusbox") {
                doc.GetObject(id, function () {
                    var statusboxInhalt = this.Data.Rows;
                    var utilJSONObjekt;

                    for (var j = 0; j < statusboxInhalt.length; j++) {
                        // make sure to re-initialize so we don't update the same reference
                        utilJSONObjekt = {};
                        utilJSONObjekt.SelectedObjektId;
                        utilJSONObjekt.SelectedObjektWerte = [];

                        var inhalt = statusboxInhalt[j];
                        console.log("Name: " + inhalt[0].text + " Wert: " + inhalt[2].text);

                        utilJSONObjekt.SelectedObjektId = inhalt[0].text;

                        var valAr = inhalt[2].text.split(",");
                        for (var k = 0; k < valAr.length; k++) {
                            utilJSONObjekt.SelectedObjektWerte.push($.trim(valAr[k]));
                        }
                        jsonObjekt.Selected.push(utilJSONObjekt);
                    }
                });
            }
        }
    });
    $('#txtboxQv').append(JSON.stringify(jsonObjekt));
    return jsonObjekt;
}

编辑:

我刚刚意识到你的问题可能是什么。从您的评论来看,这似乎doc.GetAllObjects是一个异步调用。这意味着它可能会在jsonObjekt返回后调用该函数。

jsonObjekt如果在传递给返回的函数之前不使用,这不是问题doc.GetAllObjects,但情况可能并非如此。

相反,您应该做的是getJSONObjektList将函数作为参数,并jsonObjekt在完成填充后用您的函数调用它:

function getJSONObjektList(cb) {
    var jsonObjekt = {};

    ...

    doc = XYZ.GetCurrentDocument();
    doc.GetAllObjects(function (objects) {
        // this is likely getting called after the outer function exits

        // do your computation here
        for (...) {
            ...
        }

        $('#txtboxQv').append(JSON.stringify(jsonObjekt));
        cb(jsonObjekt);
    });

    // don't rely on jsonObjekt being populated here; GetAllObjects is probably async
}

您内部还有另一个可能的异步调用(GetObject)。我不知道您的其余代码,因此我无法就如何处理何时考虑填充 jsonObjekt 提出建议,但希望这可以为您提供足够的方向来解决问题。你很可能需要重新架构一些东西。

于 2013-04-02T09:00:00.303 回答