Javascript 当关键点相同时合并2个对象值
我有两个目标:Javascript 当关键点相同时合并2个对象值,javascript,Javascript,我有两个目标: {'1': {'a': 1, 'b': 2, 'c': 3}}, {'1': {'d': 4, 'e': 5, 'f': 6}, '2': {'g': 7}}. 在本机javascript中是否有一个函数(项目中也使用下划线),我可以在其中输入两个对象并将其输出 {'1': {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}, '2': {'g': 7}} 恐怕没有这种内置javascript的本机函数。但您可以尝试编写自己的递归
{'1': {'a': 1, 'b': 2, 'c': 3}}, {'1': {'d': 4, 'e': 5, 'f': 6}, '2': {'g': 7}}.
在本机javascript中是否有一个函数(项目中也使用下划线),我可以在其中输入两个对象并将其输出
{'1': {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}, '2': {'g': 7}}
恐怕没有这种内置javascript的本机函数。但您可以尝试编写自己的递归函数来完成这项工作:
function merge(a, b) {
for (var key in b) {
try {
if (b[key].constructor === Object) {
a[key] = merge(a[key], b[key]);
} else {
a[key] = b[key];
}
} catch(e) {
a[key] = b[key];
}
}
return a;
}
可以这样使用:
var a = { '1': { 'a': 1, 'b': 2, 'c': 3 } };
var b = { '1': { 'd': 4, 'e': 5, 'f': 6}, '2': {'g': 7} };
var result = merge(a, b);
结果是:
{"1":{"a":1,"b":2,"c":3,"d":4,"e":5,"f":6},"2":{"g":7}}
如图所示。恐怕没有内置javascript的本机函数。但您可以尝试编写自己的递归函数来完成这项工作:
function merge(a, b) {
for (var key in b) {
try {
if (b[key].constructor === Object) {
a[key] = merge(a[key], b[key]);
} else {
a[key] = b[key];
}
} catch(e) {
a[key] = b[key];
}
}
return a;
}
可以这样使用:
var a = { '1': { 'a': 1, 'b': 2, 'c': 3 } };
var b = { '1': { 'd': 4, 'e': 5, 'f': 6}, '2': {'g': 7} };
var result = merge(a, b);
结果是:
{"1":{"a":1,"b":2,"c":3,"d":4,"e":5,"f":6},"2":{"g":7}}
如图所示。[已更新]您可以使用以下方法进行合并,而不会影响原始对象:
var isObject = function(o) { return Object.prototype.toString.call(o) == '[object Object]'; };
var isArray = function(o) { return Object.prototype.toString.call(o) == '[object Array]'; };
function extend(a, b) {
for (var prop in b) {
if (isObject(b[prop])) {
extend(a[prop]||(a[prop] = {}), b[prop]);
}
else if (isArray(b[prop])) {
a[prop] = (a[prop]||[]).concat(b[prop]);
}
else {
a[prop] = b[prop];
}
}
return a;
}
function merge(dest, source) {
var obj = extend({}, dest),
sources = arguments.length > 2 ? [].slice.call(arguments,1) : [source];
sources.forEach(function(source) {
extend(obj, source);
});
return obj;
}
见工作
此更新版本应允许您合并多个对象,并返回合并对象的副本,保留原始对象。[[更新的]您可以使用以下方法进行合并,而不会影响原始对象:
var isObject = function(o) { return Object.prototype.toString.call(o) == '[object Object]'; };
var isArray = function(o) { return Object.prototype.toString.call(o) == '[object Array]'; };
function extend(a, b) {
for (var prop in b) {
if (isObject(b[prop])) {
extend(a[prop]||(a[prop] = {}), b[prop]);
}
else if (isArray(b[prop])) {
a[prop] = (a[prop]||[]).concat(b[prop]);
}
else {
a[prop] = b[prop];
}
}
return a;
}
function merge(dest, source) {
var obj = extend({}, dest),
sources = arguments.length > 2 ? [].slice.call(arguments,1) : [source];
sources.forEach(function(source) {
extend(obj, source);
});
return obj;
}
见工作
此更新版本应允许您合并多个对象,并返回合并对象的副本,保留原始对象。检查否,没有本机函数可执行此操作。检查否,没有本机函数可执行此操作。您能否解释为什么这实际上会更改变量a?你能解释一下为什么这实际上也改变了变量a吗?这看起来和达林的很像。有没有办法让它跳出一个返回值而不是修改实际变量?那么,你不想让它修改原始变量吗?你想要一个新的对象吗?是的,我需要它是一个新的对象。当然,更新了代码和JSbin,给你一个克隆,并保持原样。这看起来很像Darin的。有没有办法让它跳出一个返回值而不是修改实际变量?那么,你不想让它修改原始变量吗?你想要一个新的对象吗?是的,我需要它是一个新的对象。当然,更新了代码和JSbin,给你一个克隆,并保持原样。