如何向空的JSON对象追加数据?

6
  var kids = [{}];
  i = 0;
  while (i++ !== count) {
    child = {
      value: Math.floor(Math.random() * 100),
      children: addChildren(Math.floor(Math.random() * 10))
    };
    kids.push(child);
    console.log( kids );
  }

这个问题在于kids对象有一个空的第一个元素。我该如何规避它?如果我不将其声明为JSON对象,我就无法访问push元素。
谢谢

3
JSON 部分是在哪里出现的?push 是 JavaScript 数组的方法,而不是 JavaScript 对象的方法。 - Cheeso
2
+1 给 Cheeso。"JSON" 是一个被过度使用的术语。事实上,唯一正确使用术语 "JSON 对象" 的情况是指 ECMAScript 5 中的 JSON 对象。在我看来,大多数人所指的应该说成 "JSON 字符串"。 - Ray Toal
4
每当有人说“JSON对象”或拥有一个名为“json”的包含解析数据的变量时,一只小猫咪就会死去。 - Ates Goral
问题在于kids对象有一个空的第一个元素。如果你不想让第一个元素是一个空对象,那么为什么要把一个空对象放在那里呢?请重新表述你的问题,以使你试图做什么更清晰。给出一个你所期望的输出的具体例子。你似乎不理解数组和对象之间的区别(正如其他人指出的,你似乎也不知道JSON是什么)。帮助我们帮助你... - nnnnnn
4个回答

11

只需将 kids 声明为空数组:

var kids = [];

1
听起来他想将它编码为JSON,这意味着他需要在JavaScript对象内部使用一个数组。 - Jamison Dance
Chris是正确的(+1),除了他在评论中杀死了另一只小猫(根据Ates Goral上面的评论)。至于Shamoon(OP)想要什么,我认为他还没有成功地解释清楚。 - nnnnnn
哦,每天都学到新东西。感谢指出这一点。 - Jamison Dance

3

看起来你想要一个包含多个对象实例的 JavaScript 对象,这些实例都有两个键 valuechildren。使用数组似乎是最好的选择(Khnle 和 Chris 的答案给出了示例):

[{"value":2,"children":3}, {"value":12,"children":9}, {"value":20,"children":13}]

然而,在你对一个答案的评论中,你说你不想要一个数组。一种方法是像Jergason的答案一样将其包装:

{
    "children": [
        {"value":2,"children":3}, 
        {"value":12,"children":9}, 
        {"value":20,"children":13}
    ]
}

根据您的问题,似乎您喜欢数组,因为您可以使用push操作,但是您希望完全避免使用它们。要完全避免使用数组,唯一的方法是为每个对象标记一个唯一的键。如果这确实是您想要的,那么代码应该像这样:

{
    "child0":{"value":2,"children":3}, 
    "child1":{"value":12,"children":9}, 
    "child2":{"value":20,"children":13}
}

这并不难做到;只需将kids.push(child)替换为kids["child" + i] = child即可。
但请确保这真的是你想要的,因为这个孩子集合似乎非常适合使用数组! :-)

2

你可以让你的对象包含一个空数组。

var obj = { "children": [] };
// Your looping code here
obj.children.push(child);

不确定这是否有效。这将使我的键为“children”,但我会失去“value”,对吗? - Shamoon
不是的。你可以通过 obj.children[0] 获取 child 对象,并且可以通过 obj.children[0].childrenobj.children[0].value 访问 childrenvalue - Jamison Dance

0

稍作修改(为本地变量添加var):

var kids = []; //Note this line
var i = 0; //index counter most likely needs to be local
while (i++ !== count) {
    var child = {
       value: Math.floor(Math.random() * 100),
       children: addChildren(Math.floor(Math.random() * 10))
    };
    kids.push(child);
    console.log(kids);
 }

我认为这就是你想要的。

更新:你的需求有些奇怪。你可以这样做:

 var kids = [{}]; //Note this line
 delete kids[0];
 var i = 0; //index counter most likely needs to be local
 while (i++ !== count) {
    var child = {
       value: Math.floor(Math.random() * 100),
       children: addChildren(Math.floor(Math.random() * 10))
    };
    kids.push(child);
    console.log(kids);
 }

或者

 var kids = [{
       value: Math.floor(Math.random() * 100),
       children: addChildren(Math.floor(Math.random() * 10))
 }];
 var i = 1; //1 less iteration than previous
 while (i++ !== count) {
    var child = {
       value: Math.floor(Math.random() * 100),
       children: addChildren(Math.floor(Math.random() * 10))
    };
    kids.push(child);
    console.log(kids);
 }

这会满足您的要求,但我原本展示的仍然是我认为您想要的。


这使kids成为一个数组。我需要它一直是JSON格式的。 - Shamoon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接