我想拥有以下json的对象数组(只有1个级别):
[
{
'family' : {
'name' : 'Doe',
'from' : 'Foo'
},
'couples' : [
{
'couple' : {
'man' : 'Joe',
'woman' : 'Jane'
},
'childrens' : [
{
'name' : 'Joseph',
'sex' : 'male'
},
{
'name' : 'Martin',
'sex' : 'male'
}
]
},
{
'couple' : {
'man' : 'Richard',
'woman' : 'Rose'
},
'childrens' : [
{
'name' : 'Rose',
'sex' : 'female'
},
{
'name' : 'Joe',
'sex' : 'male'
}
]
}
]
}
]
我希望将所有子项保留在一个数组中(在这种情况下为4个元素),并且每个元素都为父元素更新了__proto__
(这对夫妻有家庭,孩子有这对夫妻)。这样做我将能够轻松访问父母。
但我不知道我的解决方案是最好的还是有其他方法可以做到这一点。
我的想法是做同样的事情:
var childrensArr = [];
for (var i = 0; i < json.length; i++) {
var family = json[i].family;
var couples = json[i].couples;
for (var j = 0; j < couples.length; j++) {
var couple = couples[j].couple;
var childrens = couples[j].childrens;
for (var y = 0; y < childrens.length; y++) {
var children = childrens[y];
children.__proto__ = { couple : couple, family : family};
childrensArr.push(children);
}
}
}
但是看起来并不是所有那些阵列都是正确的,同样的人也有相同的消化来改进这个解决方案? (如果可能的话,没有框架)。
非常感谢!
修改
使用我的代码的示例。
var json = [
{
'family' : {
'name' : 'Doe',
'from' : 'Foo'
},
'couples' : [
{
'couple' : {
'man' : 'Joe',
'woman' : 'Jane'
},
'childrens' : [
{
'name' : 'Joseph',
'sex' : 'male'
},
{
'name' : 'Martin',
'sex' : 'male'
}
]
},
{
'couple' : {
'man' : 'Richard',
'woman' : 'Rose'
},
'childrens' : [
{
'name' : 'Rose',
'sex' : 'female'
},
{
'name' : 'Joe',
'sex' : 'male'
}
]
}
]
}
]
var childrensArr = [];
for (var i = 0; i < json.length; i++) {
var family = json[i].family;
var couples = json[i].couples;
for (var j = 0; j < couples.length; j++) {
var couple = couples[j].couple;
var childrens = couples[j].childrens;
for (var y = 0; y < childrens.length; y++) {
var children = childrens[y];
children.__proto__ = { couple : couple, family : family};
childrensArr.push(children);
}
}
}
console.log(childrensArr);
//It's possible to get the family attrs or the couple attrs
console.log(childrensArr[0].family.name);
P.S。:看一下这个例子,我能够访问childrensArr[0].family.name
答案 0 :(得分:1)
您可以使用嵌套方法让所有孩子都拥有Array#reduce
。
var data = [{ family: { name: 'Doe', from: 'Foo' }, couples: [{ couple: { man: 'Joe', woman: 'Jane' }, children: [{ name: 'Joseph', sex: 'male' }, { name: 'Martin', sex: 'male' }] }, { couple: { man: 'Richard', woman: 'Rose' }, children: [{ name: 'Rose', sex: 'female' }, { name: 'Joe', sex: 'male' }] }] }],
children = data.reduce(function (r, a) {
return r.concat(a.couples.reduce(function (s, b) {
return s.concat(b.children);
}, r));
}, []);
console.log(children);
.as-console-wrapper { max-height: 100% !important; top: 0; }
使用couple
属性进行修改。
var data = [{ family: { name: 'Doe', from: 'Foo' }, couples: [{ couple: { man: 'Joe', woman: 'Jane' }, children: [{ name: 'Joseph', sex: 'male' }, { name: 'Martin', sex: 'male' }] }, { couple: { man: 'Richard', woman: 'Rose' }, children: [{ name: 'Rose', sex: 'female' }, { name: 'Joe', sex: 'male' }] }] }],
children = data.reduce(function (r, a) {
return r.concat(a.couples.reduce(function (s, b) {
return s.concat(b.children.map(function (c) {
return Object.assign({ couple: b.couple }, c);
}));
}, r));
}, []);
console.log(children);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:0)
var childrens=family_json[0].couples.map(function(couple){
return couple.childrens;
});
该map函数将仅返回JSON对象中的子项