let key;
for (key in obj2) {
// 如果target(也就是obj1[key])存在,且是对象的话再去调用deepMerge,否则就是obj1[key]里面没这个对象,需要与obj2[key]合并
obj1[key] = obj1[key] && obj1[key].toString() === "[object Object]" ? deepMerge(obj1[key], obj2[key]) : (obj1[key] = obj2[key]);
return obj1;
// obj1 的结果如下:
// {"a":{"b":{"0": "A", "1": "B", "2": "C", "c": "111"}}}
或者使用下面的方法
function deepMerge(obj1, obj2) {
let key;
for (key in obj2) {
// 如果target(也就是obj1[key])存在,且是对象的话再去调用deepMerge,否则就是obj1[key]里面没这个对象,需要与obj2[key]合并
// 如果obj2[key]没有值或者值不是对象,此时直接替换obj1[key]
obj1[key] = obj1[key] && obj1[key].toString() === "[object Object]" && (obj2[key] && obj2[key].toString() === "[object Object]") ? deepMerge(obj1[key], obj2[key]) : (obj1[key] = obj2[key]);
return obj1;
// obj1 的结果如下:
// {"a":{"b":"ABC"}}
es6新增的Object.assign()方法只会合并替换对象的第一层key,对于多层的,会当做值处理。let obj1 = { a: { b: { c: "111" } }};let obj2 = { a: { b: { d: "222" } }};const obj = Object.assign(obj1, obj2);console.log(obj);// console.log的结果如下://
将
对象
(或数组)列表直接传递给
合并
函数:
merge ( ... objects ) ;
要与选项一起使用,请将第一个参数设置为
对象
数组(一个或多个数组),并将第二个参数设置为选项
对象
:
merge ( [ ... objects ] , options
JavaScript
深度
合并
我最近分享了如何使用传播运算符
合并
对象
属性,但是这种方法有一个很大的局限性:传播运算符
合并
不是“
深度
”
合并
,这意味着
合并
是递归的。 此外,嵌套
对象
的属性不会
合并
-
合并
中指定的最后一个值将替换最后一个,即使应该存在其他属性也是如此。
const defaultPerson = {
name: 'Anon',
gender: 'Female',
ha...
微小的通用/同构库,用于智能
深度
合并
对象
var nanomerge = require ( 'nanomerge' ) ;
var merger = nanomerge ( {
strategy : { array : 'merge' }
} ) ;
//=> { a: [{ a: 1 }, { a: 3 }], b: 'It works!' }
merger ( { a : [ { a : 2 } , { a : 3 } ] } , { a : [ { a : 1 } ] } , { b : 'It works!' } ) ;
小。 仅1 KB(缩小并压缩)。 仅“ nano”依赖项。 它使用“来控制大小。
很简单。 一切开箱即用。 只需即插即用。
可定制性。 但是,如果需要,所有内容都可以自定义。
该库支持Node.
js
和所有从IE 11开始的浏览器。
function deepAssign(...param) {
let result = Object.assign({}, ...param);
for (let item of param) {
for (let [idx, val] of Object.entries(item)) {
if (typeof val === 'object') {
result[idx] = deepAssign(result[id
function deepMearge(obj, target={}) {
// target 替换 obj
let p = {}; // 是为了调用 Object.prototype.toSring方便
for(let key in target) {
let is
对象
之间的使用规则:
a && b : 将a, b转换为Boolean类型, 再执行逻辑与, true返回b, false返回a
a || b : 将a, b转换为Boolean类型, 再执行逻辑或, true返回a, false返回b
转换规则:
对象
为true
非零数字为true
非空字符串为true
如果需要
深度
拷贝
合并
多个
对象
,可以使用递归
实现
。具体步骤如下:
1. 定义一个函数 `deepMergeObjects`,它接受任意数量的参数,每个参数都是一个
对象
。
2. 创建一个空
对象
`result`,用于保存
合并
后的结果。
3. 遍历所有的参数
对象
,对于每个
对象
的每个属性,判断它是否是一个
对象
。如果是一个
对象
,则递归调用 `deepMergeObjects`,将其属性
合并
到 `result` 中。否则,直接将属性赋值给 `result`。
4. 返回
合并
后的结果 `result`。
示例代码:
```
javascript
function deepMergeObjects(...objects) {
const result = {};
for (const obj of objects) {
for (const key in obj) {
if (typeof obj[key] === 'object' && obj[key] !== null) {
result[key] = deepMergeObjects(result[key] || {}, obj[key]);
} else {
result[key] = obj[key];
return result;
const obj1 = { a: { b: 1 }, c: { d: 2 } };
const obj2 = { a: { c: 3 }, e: { f: 4 } };
const obj3 = { g: 5 };
const mergedObj = deepMergeObjects(obj1, obj2, obj3);
console.log(mergedObj); // { a: { b: 1, c: 3 }, c: { d: 2 }, e: { f: 4 }, g: 5 }
在上面的代码中,我们定义了一个函数 `deepMergeObjects`,它接受任意数量的参数 `...objects`,每个参数都是一个
对象
。函数首先创建一个空
对象
`result`,用于保存
合并
后的结果。然后遍历所有的参数
对象
,对于每个
对象
的每个属性,判断它是否是一个
对象
。如果是一个
对象
,则递归调用 `deepMergeObjects`,将其属性
合并
到 `result` 中。否则,直接将属性赋值给 `result`。最终返回
合并
后的结果 `result`。