创建多级JSON字符串

时间:2012-03-02 12:22:30

标签: javascript json multidimensional-array

我想用JS创建一个多级JSON字符串。

方案

3个拥有5个祖父和3个孩子的国家,其中3个孩子也有5个朋友。

我从外部JSON文件中获取数据,如下所示。

 {"countries":[
    {
        "name":"USA",

        "grandfathers":[
            {
                "gFName":"Steve",
                "grandfathersKid":[
                    {
                        "gFKName": "Linda",
                        "kid": [{
                            "name": "Steve JR", 
                            "friends": [{
                                "name": "Kriss|John|Martin|Steven"
                            }]
                        }
                        ]
                    }

                ]
            }
        ]
    }
]}

现在我想将一些人和他们的亲戚和朋友存放在一个新的JSON列表中,该列表与外部json文件中的列表完全相同。我的目标是稍后在剧本中使用这个“自制”列表。

我对此的初步回应是

var tree = new Array();

tree = {};


var countries = new Array();

countries[0] = "canada";
countries[1] = "USA";
countries[2] = "Mexico";
countries[0][0] = "Steve"; //Lives in Canada
countries[0][0][0] = "Linda"; //Daughter of Steve
countries[0][0][0][0] = "Steve JR"; // Kid of Linda
countries[0][0][0][0][0] = "Kriss"; //Steves Friend
...


$.each(countries...function(index, value){
      tree[index].country = value;

  $.each(grandfathers...function(key, value){
      tree[index].country[key].grandfather = value;

}

等等,但这并没有给我我想要的结果。我究竟做错了什么?并且比采取一切更有效的方式?

第三次编辑......

4 个答案:

答案 0 :(得分:2)

这是你想要做的事吗?

var countries = $.map(oldCountries || [], function(country) {
    return {
        name: country.name,
        people: $.map(country.grandfathers || [], function(gpa) {
            return {
                name: gpa.gFName,
                children: $.map(gpa.grandfathersKid || [], function(parent) {
                    return {
                        name: parent.gFKName,
                        children: $.map(parent.kid || [], function(kid) {
                            return {
                                name: kid.name,
                                friends: kid.friends
                            };
                        })
                    };
                })
            };
        })
    };
});

我不确定如何处理friends节点。是否应将其标准化为更有用的内容,或者您​​是否希望不管它?

Fiddle演示了这项技术。

答案 1 :(得分:1)

我认为我们需要更多地了解您的要求。但我在这里看到的几件事是:

  • 您声明树并将其初始化为数组,然后立即将其重新初始化为
    空对象
  • 您不是在这里创建中间节点,例如tree[index],而只是假设 它们存在。
  • 您正在尝试使用dot-property分配对象的country[key]属性 访问。

您能提供国家结构和祖父的结构吗?它们是否嵌套?

最后,您想要什么输出格式?上面的代码暗示了它,但它仍然有点模糊。

修改

那么你是否想要实现这样的结构?:

var countries = [
  {
     name: "Canada",
     people: [
       {
          name: "Steve",
          children: [
            {
               name: "Linda",
               children: [
                 {
                    name: "Steve, Jr.",
                    friends: [
                      {
                         name: "Kriss"
                      }
                      //, more friends
                    ]
                 }
                 //, more grandchildren
               ]
            }
            //, more parents
          ]
       }
       //, more grandparents
     ]
   }
   //, more countries
 ];

答案 2 :(得分:1)

可能this jsfiddle可以帮助您开始使用吗? here is an example来自您的代码。

答案 3 :(得分:0)

听起来像是一个家庭作业,所以我会试着指出你正确的方向。我认为你混淆了对象和数组。您可以使用“country”对象和“person”对象。国家/地区对象应该具有一系列人物对象,作为居民。 Person对象可以有一个person对象数组作为后代。添加类似“addDescendant”的方法,在人员下创建新人。从那里你可以随意构建结构。这是一些伪代码:

countries = [];
function Country(name){ this.name = name; this.population = [];}
function Person(kids){this.descendants = []; this.addDescendant = function(){...}; 
    //loop from 1 to kids and add descendants as "new Person"
}
person = new Person(3);
country1 = new Country("MyCountry1");
// now add people to country1.population
countries.push(country1);

最终结构应如下所示:

countries = [
    { name: "country 1",
      people: [{ name: "Steve"}, 
               {name: "Clara", descendants: [{name: "Clara's daughter"}, 
                                             {name: "Clara's son"}]
              ]}
    },
    { name: "country 2",
      people: [{}, {} ...]

    }
];