1
json1 = {
    "t": {
        "o": [{
            "name": "tor",
            "pair": 1
        }],
        "i": [{
            "name": "tiset",
            "pair": 1
        }]
    }
}
json2 = {
    "t": {
        "a": [{
            "name": "tapch",
            "pair": 1
        }],
        "i": [{
            "name": "tiset",
            "pair": 9
        }]
    }
}

上記のような 2 つの応答があります。ここで、次のようにマージjson1json2て単一にする必要があります。json3

json3 = {
    "t": {
        "a": [{
            "name": "tapch",
            "pair": 1
        }],
        "o": [{
            "name": "tor",
            "pair": 1
        }],
        "i": [{
            "name": "tiset",
            "pair": 9
        }]
    }
}

つまり、名前が同じ場合、最大ペアが取り出されます。私はたくさん試しましたが、解決策が得られませんでした。誰か助けてくれませんか?そして、特定のハードコードされたソリューションではなく、ループとして必要です。

4

2 に答える 2

1

かなり簡単なはずです。

最初の JSON オブジェクトを取得するだけです

var json3 = json1;

[編集:]実際にjson1を保持したい場合の代替方法

var json3 = {'t':{}};
for (key in json1['t']) {
    json3['t'][key] = json1['t'][key];
}

2 番目のオブジェクトをそれにマージします

for (key in json2['t']) {
    json3['t'][key] = json2['t'][key];
}

そして、あなたは終わった

于 2012-12-25T10:13:41.157 に答える
0

最初の値がプリミティブ値で、2 番目の値がオブジェクト (オブジェクトによって上書きされるようにします) の場合、存在する値の処理を調整する必要があるかもしれません。質問で明確にされていないためです。

プリミティブ値は渡す関数で扱うだけですが、コードを読んで理解する必要があります。

これは、必要なものに近づくはずです。

渡されたすべてのオブジェクトを単一のものにマージします (最後の引数は、関数が同じプリミティブ プロパティを処理するためのものです) 関数が渡された場合、最後のオブジェクトを反復処理しません。マージするオブジェクトです。今はコードのクリーンさについてあまり気にしていないので、これを少し調整する必要があります。

たぶん、これは正しい方向に進むのに役立ちます

function merge() {
    var srt = typeof arguments[arguments.length - 1] == "function" ? arguments[arguments.length - 1] : function (a, b, prop) {
            return a[prop] > b[prop] ? a[prop] : b[prop];
        };
    var merge = {};

    for (var i = 0; i < arguments.length - (typeof arguments[arguments.length - 1] == "function" ?1:0); i++)
    inner(arguments[i], merge);

    function inner(obj, mrg) {
        var type = ({}).toString.call(obj);
        if (type == "[object Object]") {
            if (!mrg || typeof mrg != "object" ) mrg = {}; //Well it depends if you want primitive values to be overwritten by an Object or not
            for (var prop in obj)
            if (!mrg[prop] && typeof obj[prop] == "object") mrg[prop] = inner(obj[prop]);
            else if (mrg[prop] && typeof obj[prop] == "object") mrg[prop] = inner(obj[prop], mrg[prop]);
            else if (mrg[prop]) mrg[prop] = srt(mrg, obj, prop);
            else mrg[prop] = obj[prop];

        } else if (type == "[object Array]") {
            if (!mrg) mrg = [];
            for (var i = 0; i < obj.length; i++)
            if (!mrg[i] && typeof obj[i] == "object") mrg[i] = inner(obj[i]);
            else if (mrg[i] && typeof obj[i] == "object") mrg[i] = inner(obj[i], mrg[i]);
            else if (mrg[i]) mrg[i] = srt(mrg, obj, i);
            else mrg[i] = obj[i];
        } else {
            // Handle calling of the inner function with a primitive value
        }
        return mrg;
    }
    return merge;
}

var json1 = {
    "t": {
        "o": [{
            "name": "tor",
            "pair": 1
        }],
        "i": [{
            "name": "tiset",
            "pair": 1
        }]
    }
};
var json2 = {
    "t": {
        "a": [{
            "name": "tapch",
            "pair": 1
        }],
        "i": [{
            "name": "tiset",
            "pair": 9
        }]
    }
};

var json3 = merge(json1, json2, {
    a: "test"
}, function (a, b, prop) {
    if (prop == "pair") return a[prop] > b[prop] ? a[prop] : b[prop]; //If the propertie is pair, return the bigger one
    else return b[prop]; //return the to merge Object
});
console.log(json3);
/*{"a": "test", "t": {"a": [{"name": "tapch", "pair": 1}], "i": [{"name": "tiset", "pair": 9}], "o": [{"name": "tor", "pair": 1}]}}*/  

これはJSBinの例です

コメント

一部のプロパティのみをマージするには、プロパティのマップとして機能するパラメーターを追加し、マップが存在する場合は、マップのプロパティを反復処理して、それらのみをコピーします。そうでない場合は、オブジェクトからすべてのプロパティをコピーしてマージします。

コード的には、これは次のようになります。

function merge() {
    var srt = typeof arguments[arguments.length - 1] == "function" ? arguments[arguments.length - 1] : function (a, b, prop) {
            return a[prop] > b[prop] ? a[prop] : b[prop];
        };
    var merge = {};
    var map = arguments[arguments.length - 2]._MAP ? arguments[arguments.length - 2] : false;
    delete map._MAP
    for (var i = 0; i < arguments.length - (typeof arguments[arguments.length - 1] == "function" ? 1 : 0) - (map ? 1 : 0); i++) {
        inner(arguments[i], merge, map);
    }

    function inner(obj, mrg, map) {
        var type = ({}).toString.call(obj);
        if (type == "[object Object]") {
            if (!mrg || typeof mrg != "object") mrg = {}; //Well it depends if you want primitive values to be overwritten by an Object or not
            for (var prop in map || obj) {
                if (!mrg[prop] && typeof obj[prop] == "object") mrg[prop] = inner(obj[prop], undefined, map[prop]);
                else if (mrg[prop] && typeof obj[prop] == "object") mrg[prop] = inner(obj[prop], mrg[prop], map[prop]);
                else if (mrg[prop]) mrg[prop] = srt(mrg, obj, prop);
                else if (!obj[prop]) return
                else mrg[prop] = obj[prop];
            }

        } else if (type == "[object Array]") {
            if (!mrg) mrg = [];
            for (var i = 0; i < (map || obj).length; i++)
            if (!mrg[i] && typeof obj[i] == "object") mrg[i] = inner(obj[i], undefined, map[i]);
            else if (mrg[i] && typeof obj[i] == "object") mrg[i] = inner(obj[i], mrg[i], map[i]);
            else if (mrg[i]) mrg[i] = srt(mrg, obj, i);
            else mrg[i] = obj[i];
        } else {
            // Handle calling of the inner function with a primitive value
        }
        return mrg;
    }
    return merge;
}

var json1 = {
    "t": {
        "o": [{
            "name": "tor",
            "pair": 1
        }],
        "i": [{
            "name": "tiset",
            "pair": 1
        }]
    }
};
var json2 = {
    "t": {
        "a": [{
            "name": "tapch",
            "pair": 1
        }, {
            a: "a"
        }],
        "i": [{
            "name": "tiset",
            "pair": 9
        }]
    }
};

var json3 = merge(json1, json2, {
    _MAP: true,
    "t": {
        a: [{
            name: true
        },
        false],
        i: false
    }
}, function (a, b, prop) {
    if (prop == "pair") return a[prop] > b[prop] ? a[prop] : b[prop]; //If the propertie is pair, return the bigger one
    else return b[prop]; //return the to merge Object
});
var json4 = merge(json1, json2, {
    _MAP: true,
    "t": {
        a: [false],
        i: false
    }
}, function (a, b, prop) {
    if (prop == "pair") return a[prop] > b[prop] ? a[prop] : b[prop]; //If the propertie is pair, return the bigger one
    else return b[prop]; //return the to merge Object
});
console.log(json3, json4);

/*{"t": {"a": [{"name": "tapch"}, {"a": "a"}], "i": [{"name": "tiset", "pair": 9}]}}*/
/*{"t": {"a": [{"name": "tapch", "pair": 1}], "i": [{"name": "tiset", "pair": 9}]}}*/

ご覧のとおり

  • json3作成され、次をコピーするマップを渡します。
    • 物体t
      • 配列a
        • 0の要素a
        • name元素の性質0
        • 要素全体1
      • 配列全体i
  • json4作成され、次をコピーするマップを渡します。
    • 物体t
      • 配列a
      • 0の全要素a
      • 配列全体i

ご覧のとおり、他のプロパティはコピーされていません

ここに別のJSBinがあります。見て、少しいじってください (そしてコードを読んでください)。

于 2012-12-25T16:53:11.277 に答える