dcl*_*901 8 javascript merge deep-copy extend
假设您有两个对象:
var foo = {
a : 1,
b : 2
};
var bar = {
a : 3,
b : 4
}
Run Code Online (Sandbox Code Playgroud)
合并它们(并允许深度合并)创建它的最佳方法是什么:
var foobar = {
a : [1, 3],
b : [2, 4]
}
Run Code Online (Sandbox Code Playgroud)
编辑问题澄清:理想情况下,如果现有属性在一个而不是另一个,我会期望仍然创建一个数组,用于规范化目的并允许进一步减少地图,但是答案我是看下面绰绰有余.出于本练习的目的,我只是寻找字符串或数字合并,所以我没有接受所有可能的情境案例.如果你拿着枪在我的头上然后让我做出选择,我会说默认为阵列.
谢谢你的贡献.
这应该做你想要的.它会递归地将任意深度的对象合并到数组中.
// deepmerge by Zachary Murray (dremelofdeath) CC-BY-SA 3.0
function deepmerge(foo, bar) {
var merged = {};
for (var each in bar) {
if (foo.hasOwnProperty(each) && bar.hasOwnProperty(each)) {
if (typeof(foo[each]) == "object" && typeof(bar[each]) == "object") {
merged[each] = deepmerge(foo[each], bar[each]);
} else {
merged[each] = [foo[each], bar[each]];
}
} else if(bar.hasOwnProperty(each)) {
merged[each] = bar[each];
}
}
for (var each in foo) {
if (!(each in bar) && foo.hasOwnProperty(each)) {
merged[each] = foo[each];
}
}
return merged;
}
Run Code Online (Sandbox Code Playgroud)
除了合并对象将包含继承属性的副本之外,这一个将执行相同的操作.这可能不是你想要的(根据RobG在下面的评论),但如果这实际上是你正在寻找的,那么这里是:
// deepmerge_inh by Zachary Murray (dremelofdeath) CC-BY-SA 3.0
function deepmerge_inh(foo, bar) {
var merged = {};
for (var each in bar) {
if (each in foo) {
if (typeof(foo[each]) == "object" && typeof(bar[each]) == "object") {
merged[each] = deepmerge(foo[each], bar[each]);
} else {
merged[each] = [foo[each], bar[each]];
}
} else {
merged[each] = bar[each];
}
}
for (var each in foo) {
if (!(each in bar)) {
merged[each] = foo[each];
}
}
return merged;
}
Run Code Online (Sandbox Code Playgroud)
我在http://jsconsole.com上用你的例子试了一下,它运行正常:
deepmerge(foo, bar)
{"a": [1, 3], "b": [2, 4]}
bar
{"a": 3, "b": 4}
foo
{"a": 1, "b": 2}
Run Code Online (Sandbox Code Playgroud)
稍微复杂的对象也起作用:
deepmerge(as, po)
{"a": ["asdf", "poui"], "b": 4, "c": {"q": [1, 444], "w": [function () {return 5;}, function () {return 1123;}]}, "o": {"b": {"t": "cats"}, "q": 7}, "p": 764}
po
{"a": "poui", "c": {"q": 444, "w": function () {return 1123;}}, "o": {"b": {"t": "cats"}, "q": 7}, "p": 764}
as
{"a": "asdf", "b": 4, "c": {"q": 1, "w": function () {return 5;}}}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4651 次 |
| 最近记录: |