【问题标题】:Merge two json objects with jquery用jquery合并两个json对象
【发布时间】:2011-12-12 17:27:24
【问题描述】:

我有两个 json 对象:

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

和

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

我一直在寻找将这两个对象组合成一个对象的方法。

提前致谢。

【问题讨论】:

标签: jquery ajax json object merge


【解决方案1】:

使用extend

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

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

$.extend(object1, object2);

DEMO

【讨论】:

  • 哦,没想到。 +1
  • 感谢大家的快速响应,我有一个空白页...仍在处理中...我正在使用 jquery
  • 这是我的代码:var saloon = "example.com/search.json?section=saloon"; var coupe = "example.com/search.json?section=coupe"; var obj1 = JSON.parse(saloon); var obj2 = JSON.parse(coupe); var allResults = $.extend({}, obj1, obj2)
  • 看看这里你可以像这样修改它但老实说我不明白你在做什么jsfiddle.net/juBAc/3
  • 对不起,你让我离开了 3nigma。这两个链接从 json api 返回数据
【解决方案2】:

好吧,一旦您的 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。如果您不想修改现有对象,请不要忘记先传递一个空对象。

【讨论】:

    【解决方案3】:

    你可以使用合并

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

    【讨论】:

    • 这只适用于数组 - 而且它会改变第一个 jsonOb1。对于合并对象,应改用$.extend。
    【解决方案4】:

    所有这些都会覆盖整个对象,即使一个属性不同,如果您想附加具有新属性的对象并仅覆盖 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;
    }
    

    【讨论】:

      【解决方案5】:

      感谢拉菲。

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

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

      【讨论】:

        猜你喜欢
        • 2018-01-14
        • 2012-04-25
        • 2021-07-21
        • 1970-01-01
        • 2018-12-17
        • 2019-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多