我想用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;
}
等等,但这并没有给我我想要的结果。我究竟做错了什么?并且比采取一切更有效的方式?
第三次编辑......
答案 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]
,而只是假设
它们存在。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: [{}, {} ...]
}
];