【问题标题】:Why can't I build this Javascript object?为什么我不能构建这个 Javascript 对象?
【发布时间】:2010-03-13 07:46:39
【问题描述】:

我有一个对象,我正试图从另一个对象中填充(也就是说,遍历返回对象以生成一个只包含原始选定值的对象)。我的代码如下所示:

var collect = {};

function getHistoricalData(username){
$.getJSON("http://url/" + username + ".json?params",
            function(data){
                for (var i=0; i < data.length; i++) {
                    console.log(i);
                    collect = { i : {text : data[i].text}};
                    $("#wrap").append("<span>" + data[i].text + "</span><br />");

                };
                console.log(collect);
            }); 

}

所以我正在使用 Firebug 进行调试,这就是我所知道的:

  • JSON 对象完好无损
  • console.log(i); 按预期显示数字 1-20
  • 当我最后记录collect 对象时,它的结构是这样的: var collect = { i : {text : "the last iteration's text"}};

    所以增量器正在“应用”到 data[i].text 并返回文本值,但它并没有按照我的预期做,即创建了 collect 对象的新成员;它只是覆盖collect.i 20 次,并留下最后一个值。

我需要使用不同的语法来分配对象成员吗?我尝试了collect.i.text = 和collect[i].text =,错误是我尝试的任何内容都未定义。

我很想知道这里发生了什么,所以解释越深入越好。

谢谢!

【问题讨论】:

    标签: javascript json


    【解决方案1】:

    您最后在对象中只看到一个属性的原因是您没有在每次循环迭代中扩充它 - 您正在覆盖它。

    collect = { i : {text : data[i].text}};

    这表示:创建一个具有一个属性i 的对象,其值为具有一个属性text 的另一个对象,并将其分配给变量collect。您想要做的是为i 的每个值设置现有collect 对象的属性,其中i 是属性的名称。

    为了创建动态设置名称的对象属性,您必须使用数组样式的语法,例如:collect[i]。我认为您不能像尝试过的那样混合使用数组语法和对象文字语法。试试这个(免责声明,未经测试):

    collect[i] = { text: data[i]["text"] };

    【讨论】:

    • 编辑解释发生了什么。 :)
    【解决方案2】:
     collect[i] = {text : data[i].text};
    

    如果使用collect[i].text,由于赋值前collect[i]不存在,所以会返回undefined,它没有text属性。

    还有:

    1. collect.i 表示 collect["i"]。这与collect[i] 完全不同。
    2. 您可以使用数组并附加.push。

    【讨论】:

      【解决方案3】:

      如您所知,问题出在这一行:

       collect = { i : {text : data[i].text}};
      

      循环的每次迭代,您都会擦除收集对象并为其分配一个新对象作为值。这就是为什么最后它只显示最后一次迭代。

      试试这个:

       collect[i] = {text : data[i].text};
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-19
        • 2012-09-27
        • 1970-01-01
        • 2014-09-22
        • 1970-01-01
        • 1970-01-01
        • 2014-04-04
        • 1970-01-01
        相关资源
        最近更新 更多