使用jQuery合并两个JSON对象

21

2
类似于这个:http://api.jquery.com/jQuery.extend/? - John Kalberer
5个回答

55

使用extend函数。

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

传递一个空对象作为目标(第一个)参数,可以保留两个对象。如果您想合并第二个对象,则可以像下面这样操作

$.extend(object1, object2);

演示


谢谢你们的迅速回复,我得到了一个空白页面...还在努力解决中...我正在使用jquery。 - echez
这是我的代码:var saloon = "http://example.com/search.json?section=saloon"; var coupe = "http://example.com/search.json?section=coupe";var obj1 = JSON.parse(saloon); var obj2 = JSON.parse(coupe);var allResults = $.extend({}, obj1, obj2) - echez
看这里,你可以像这样修改它,但说实话我不太明白你想做什么。http://jsfiddle.net/juBAc/3/ - Rafay
抱歉,3nigma让我有些困惑。这两个链接从一个JSON API返回数据。 - echez

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}

演示

编辑: 正如3nigma所提到的,如果您正在使用jQuery,则最好使用$.extend。不要忘记首先传递一个空对象,如果您不想修改现有对象。


3
您可以使用合并操作。
var mergedObj = $.merge(jsonObj1, jsonObj2);

2
这只适用于数组,并且会更改第一个jsonOb1的内容。合并对象应该使用$.extend - acme

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

演示

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

0

感谢 Rafay。

如果您想要扩展数组中的一个对象,这个方法完全可行,以下是我的示例:

$(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);
      
    });
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接