递归重组拆分键/值对

时间:2012-12-12 01:49:14

标签: javascript json recursion

这让我头疼,如果这里有任何慷慨的javascript大师,我会非常感谢一些帮助

我想要实现的目标是:

鉴于此:

var keys   = ["Age", "Name", "Photos", { "Friends": ["FirstName", "LastName"] }];
var values = [ [31, "Bob", ["1.jpg", "2.jpg"], [ ["Bob", "Hope"], ["Foo", "Bar"] ] ], [21, "Jane"] ["4.jpg", "5.jpg"], [ ["Mr", "T"],["Foo", "Bar"] ] ];

我想回复一下:

var object = [
                {
                "Age"    : 31,
                "Name"   : "Bob",
                "Photos" : ["1.jpg", "2.jpg"]
                "Friends": [ 
                               {
                                   "FirstName": "Bob",
                                   "LastName" : "Hope"
                                },
                                {
                                    "FirstName": "Foo",
                                    "LastName" : "Bar"
                                }
                ] 
            },
            {
                "Age"     : 21,
                "Name"    : "Jane",
                "Photos" : ["4.jpg", "5.jpg"]
                "Friends": [ 
                               {
                                   "FirstName": "Mr",
                                   "LastName" : "T"
                                },
                                {
                                    "FirstName": "Foo",
                                    "LastName" : "Bar"
                                }
                ] 
            }               
];

这是针对规范提案(JsonR)我正在研究here

目前我能够(几乎)解决这个问题(但不是更深入......):

var keys   = ["Age", "Name", "Photos" ];
var values = [ [31, "Bob", ["1.jpg", "2.jpg"]], [21, "Jane", ["4.jpg", "5.jpg"]] ];

感谢您的任何反馈或帮助!

2 个答案:

答案 0 :(得分:2)

这是一个能做我想你想要的功能:

function keyValuesToObject(keys, values) {
    var obj = [];
    for (var i = 0; i < values.length; i++) {
        var value = values[i];
        obj.push({});
        for (var j = 0; j < value.length; j++) {
            var key = keys[j];
            if (typeof key === "object") {
                for (var k in key) {
                    obj[i][k] = keyValuesToObject(key[k], value[j]);
                }
            }
            else {
                obj[i][key] = value[j];
            }
        }
    }
    return obj;
};

它不处理格式错误的输入,因此您可能希望根据计划使用它来检查。

您可以在this online jsFiddle demo上看到它。

顺便说一下,你给出的键值和值值数组的开始和结束括号都不匹配,所以我不得不修复它们。

答案 1 :(得分:1)

Fiddle

function pairUpItem(keys, values) {
    var len = keys.length;
    var result = {};
    for (var i = 0; i < len; i++) {
        var key = keys[i];
        var value = values[i];
        if (typeof(key) == "string") {
            result[key] = value;
        } else {
            for (var key2 in key) {
                if (key.hasOwnProperty(key2)) {
                    result[key2] = pairUpItems(key[key2], value);
                }
            }
        }
    }
    return result;
}

function pairUpItems(keys, values) {
    var len = values.length;
    var result = [];
    for (var i = 0; i < len; i++) {
        var value = values[i];
        if (typeof(value) !== "undefined") {
            result.push(pairUpItem(keys, value));
        }
    }
    return result;
}

var keys   = ["Age", "Name", "Photos", { "Friends": ["FirstName", "LastName"] }];
var values = [ [31, "Bob", ["1.jpg", "2.jpg"], [ ["Bob", "Hope"], ["Foo", "Bar"] ] ], [21, "Jane", ["4.jpg", "5.jpg"], [ ["Mr", "T"],["Foo", "Bar"] ] ] ];

var result = pairUpItems(keys, values);
​console.dir(result);​