0

これは私の頭を痛めています。ここに寛大な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) 用です

現在、私はこれを(ほとんど)解決することができます(しかし、それ以上ではありません..):

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

フィードバックやヘルプをありがとう!

4

2 に答える 2

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;
};

不正な入力を処理しないため、使用方法によってはチェックを入れることをお勧めします。

このオンラインjsFiddleデモで実際の動作を確認できます。

ちなみに、あなたが与えたキーと値の値の配列は、開き括弧と閉じ括弧が一致していなかったので、それらを修正する必要がありました。

于 2012-12-12T02:11:59.333 に答える
1

フィドル

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);​
于 2012-12-12T02:21:57.830 に答える