简体   繁体   English

如何递归合并2个javascript对象?

[英]How to recursively merge 2 javascript objects?

I have 2 objects that I need to merge and keep all properties in tact, tried with jQuery $.extend but I cant get it to work .我有 2 个对象需要合并并保持所有属性完好无损,尝试使用 jQuery $.extend 但我无法让它工作。 I tried all posts with how to merge javascript objects but simply cant get this to work.我尝试了所有关于如何合并 javascript 对象的帖子,但根本无法让它工作。

var thz_icon_source = {"Spinners":["spinnericon1","spinnericon2"],"Awesome":["awesomeicon1","awesomeicon2"]};
var fa_icon_source = {"Spinners":["faspinner1","faspinner2"],"Awesome":["faawesome1","faawesome2"]};
var new_source ={};
$.extend(new_source,fa_icon_source,thz_icon_source);

console.log(thz_icon_source);
console.log(fa_icon_source);
console.log(new_source);

desired output should be like所需的输出应该像

{
"Spinners":["faspinner1","faspinner2","spinnericon1","spinnericon2"],
"Awesome":["faawesome1","faawesome2","awesomeicon1","awesomeicon2"]
}

This post Merge two json/javascript arrays in to one array has a simple object mine is not same as that one.这篇文章将两个 json/javascript 数组合并到一个数组中有一个简单的对象,我的对象与那个不同。

Demo 演示

function mergeJSON(json1,json2)
{
    var result = json1 ;
    for (var prop in json2) 
    {
        if (json2.hasOwnProperty(prop)) 
        {
            result[prop] = result[prop].concat(json2[prop]);
        }
    }
    return result;
}

$.extend merges in missing properties, it doesn't combine the properties that are in common. $.extend将合并缺少的属性,但不会合并常见的属性。 You need to write a loop. 您需要编写一个循环。

 var thz_icon_source = { "Spinners": ["spinnericon1", "spinnericon2"], "Awesome": ["awesomeicon1", "awesomeicon2"] }; var fa_icon_source = { "Spinners": ["faspinner1", "faspinner2"], "Awesome": ["faawesome1", "faawesome2"] }; var new_source = {}; // First add in the new elements from thz_icon_source $.extend(new_source, fa_icon_source, thz_icon_source); // Now merge the common elements $.each(fa_icon_source, function(k, e) { if (thz_icon_source.hasOwnProperty(k)) { new_source[k] = e.concat(thz_icon_source[k]); } }); console.log(thz_icon_source); console.log(fa_icon_source); console.log(new_source); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 

You can use this prototype to merge 2 or more objects the way you want it: 您可以使用此原型以所需的方式合并2个或更多对象:

 Object.prototype.assignDeep = function() { var self = this; Object.keys(arguments).forEach(obj => { Object.keys(self).forEach(val => { if (arguments[obj].hasOwnProperty(val)) { var tmp = arguments[obj][val] instanceof Array ? arguments[obj][val] : [arguments[obj][val]]; self[val] = self[val].concat(tmp); } }); }); return self; } var thz_icon_source = {"Spinners":["spinnericon1","spinnericon2"],"Awesome":["awesomeicon1","awesomeicon2"]}; var fa_icon_source = {"Spinners":["faspinner1","faspinner2"],"Awesome":["faawesome1","faawesome2"]}; var b = thz_icon_source.assignDeep(fa_icon_source); console.log(b); 

You should use a loops with .concat() : 您应该使用.concat()循环:

function objectConcatArrays(){
  var a = arguments, o = {};
  for(var i=0,l=a.length; i<l; i++){
    for(var p in a[i]){
      if(p in o){
        o[p] = o[p].concat(a[i][p]);
      }
      else{
        o[p] = a[i][p];
      }
    }
  }
  return o;
}
var thz_icon_source = {"Spinners":["spinnericon1","spinnericon2"],"Awesome":["awesomeicon1","awesomeicon2"]};
var fa_icon_source = {"Spinners":["faspinner1","faspinner2"],"Awesome":["faawesome1","faawesome2"]};
var res = objectConcatArrays(thz_icon_source, fa_icon_source);
console.log(res);

Each argument represents an Object of Arrays. 每个参数代表一个数组对象。 Add more if you want. 如果需要,添加更多。

Both objects into an array? 将两个对象都放入一个数组?

var thz_icon_source = {"Spinners":["spinnericon1","spinnericon2"],"Awesome":["awesomeicon1","awesomeicon2"]};
var fa_icon_source = {"Spinners":["faspinner1","faspinner2"],"Awesome":["faawesome1","faawesome2"]};
var new_source = new Array();
new_source[0] = thz_icon_source;
new_source[1] = fa_icon_source ;

console.log(new_source);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM