[英]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 数组合并到一个数组中有一个简单的对象,我的对象与那个不同。
$.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.