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`。