我有一个对象我正在尝试从另一个对象填充(也就是说,迭代一个返回对象以生成一个只包含原始选定值的对象)。我的代码如下所示:
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进行调试,这就是我所知道的:
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 =
,错误在于我尝试的任何内容都是未定义的。
我很想知道这里发生了什么,所以解释越深入越好。
谢谢!
答案 0 :(得分:2)
你最终在对象中只看到一个属性的原因是你没有在每次循环迭代中扩充它 - 你要覆盖它。
collect = { i : {text : data[i].text}};
这说:创建一个具有一个属性i
的对象,其值是另一个具有一个属性text
的对象,并将其分配给变量collect
。您想要做的是为collect
的每个值设置现有i
对象的属性,其中i
是属性的名称。
为了创建一个动态设置名称的对象属性,必须使用数组样式语法,如下所示:collect[i]
。我不认为你可以像你尝试过的那样混合数组语法和对象文字语法。试试这个(免责声明,未经测试):
collect[i] = { text: data[i]["text"] };
答案 1 :(得分:0)
collect[i] = {text : data[i].text};
如果您使用collect[i].text
,由于collect[i]
在分配之前不存在,它将返回undefined
,其中没有text
属性。
此外:
collect.i
表示collect["i"]
。这与collect[i]
完全不同。 .push
。答案 2 :(得分:0)
正如您所知,问题出现在这一行:
collect = { i : {text : data[i].text}};
循环的每次迭代,您正在擦除collect对象并为其指定一个新对象作为值。这就是为什么它最终只显示最后一次迭代。
试试这个:
collect[i] = {text : data[i].text};