使用jquery合并两个json对象

时间:2011-12-12 17:27:24

标签: jquery ajax json object merge

我有两个json对象:

http://example.com/search.json?section=saloon

http://example.com/search.json?section=coupe

我一直在寻找一种方法将这两个对象合并为一个对象。

提前致谢。

5 个答案:

答案 0 :(得分:52)

使用extend

var object = $.extend({}, object1, object2);

通过传递一个空对象作为目标(第一个)参数,你可以保留这两个对象,如果你想要合并第二个对象,你可以这样做

$.extend(object1, object2);

DEMO

答案 1 :(得分:5)

好吧,一旦获取并解析了JSON,您就可以遍历这些属性并将它们添加到新对象中。但是要小心,如果有相同名称的属性,它们将被覆盖。

var data1 = '{"foo": 123, "test":"foo"}';
var data2 = '{"bar": 456, "test":"bar"}';

var json1 = JSON.parse(data1);
var json2 = JSON.parse(data2);

var merged = {};
for(var i in json1) {
    if (json1.hasOwnProperty(i))
        merged[i] = json1[i];
}
for(var i in json2) {
    if (json2.hasOwnProperty(i))
        merged[i] = json2[i];
}

console.log(merged);

生成的合并JSON对象将是:

{foo: 123, test: "bar", bar: 456}

DEMO

修改: As 3nigma mentioned,如果您使用的是jQuery,则最好使用$.extend。如果您不想修改现有对象,请不要忘记首先传递空对象。

答案 2 :(得分:2)

所有这些都会覆盖整个对象,即使一个属性不同,如果要附加具有新属性的对象并仅覆盖JSON的叶子,则使用此属性。

<强> DEMO

//smart not to delete entire object if a property is different, (unlike  $.extend or _.extend)
// {"a":{"b":"c", "e":"f"}},{"a":{"b":"x"}} -> {"a":{"b":"x", "e":"f"}} not {"a":{"b":"x"}}
//obj1 is not effected,
//obj1 values are overwriten at leaves of obj2
//  smartJSONextend({"a":{"b":"c"}},{"a":"d"}) - {"b":"c"} will be "d"

function smartJSONextend(obj1, obj2) {
    //clone
    var mergedObj = JSON.parse(JSON.stringify(obj1));

    (function recurse(currMergedObj, currObj2){
        var key;

        for (key in currObj2) {
            if (currObj2.hasOwnProperty( key )){

                //keep path alive in mergedObj
                if (!currMergedObj[key]){
                    currMergedObj[key] = undefined;
                }

                if ( typeof currObj2[key] === "string" || typeof currObj2[key] === "number" || typeof currObj2[key] === "boolean" ){
                //overwrite if obj2 is leaf and not nested
                    currMergedObj[key] = currObj2[key];
                } else if (typeof currObj2[key] === "object"){
                //obj2 is nested

                    //and currMergedObj[key] is undefined, sync types
                    if (!currMergedObj[key]) {
                        //obj2[key] ifArray
                        if(currObj2[key].length !== undefined){
                            currMergedObj[key] = [];
                        } else {
                            currMergedObj[key] = {};
                        }
                    }
                    recurse(currMergedObj[key], currObj2[key]);
                }
            }
        }
    }(mergedObj, obj2));

    return mergedObj;
}

答案 3 :(得分:1)

您可以使用合并

var mergedObj = $.merge(jsonObj1, jsonObj2);

答案 4 :(得分:0)

感谢拉斐。

如果你想在数组中扩展一个对象,这是完全可行的,这是我的例子:

$(document).ready(function() {

    $(document).on("click", ".btnClassClose", function () {

        var tinyMCEcontent = tinymce.activeEditor.getContent();
        var getAttrIDArray = [];

        $("#" + getelementId).html("");
        $("#" + getelementId).html(tinyMCEcontent);
        $("#" + getelementId).append(buttonEDI);

        var PageName = new Object();
        PageName["mdlPageContentHtml"] = tinyMCEcontent;
        var getarraylist = JSON.parse($("#" + getelementId).attr('data-atrrib'));



        var obj = $.extend({}, getarraylist, PageName);

        getAttrIDArray.push(obj);
        var contentGetAttrIDArray = SecondMainSendAjax("CMS?handler=Content", getAttrIDArray);
      
    });
});