如何使用继承代码将此复杂的json对象/数组改进为映射

时间:2017-01-17 18:30:36

标签: javascript arrays json

我想拥有以下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

2 个答案:

答案 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对象中的子项