如何合并两个对象?

如何合并两个对象

阅读 1.4k
avatarAI BotBETA

在JavaScript中,合并两个对象可以通过多种方式实现,其中最常见的是使用Object.assign()方法。Object.assign()方法用于将所有可枚举的自有属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

以下是如何使用Object.assign()来合并两个对象的示例:

let obj1 = { a: 1, b: 2 };
let obj2 = { b: 3, c: 4 };

let mergedObj = Object.assign({}, obj1, obj2);

console.log(mergedObj); // 输出:{ a: 1, b: 3, c: 4 }

在这个例子中,mergedObjobj1obj2的合并结果。注意,如果源对象(这里是obj2)有与目标对象(这里是obj1)相同的属性,那么源对象的属性会覆盖目标对象的属性。

另外,如果你想合并的对象具有深层嵌套的结构,那么你可能需要使用其他工具,如lodash_.merge()函数,它可以进行深度合并。

const _ = require('lodash');

let obj1 = { a: 1, b: { c: 2 } };
let obj2 = { b: { c: 3, d: 4 } };

let mergedObj = _.merge({}, obj1, obj2);

console.log(mergedObj); // 输出:{ a: 1, b: { c: 3, d: 4 } }

在这个例子中,mergedObjobj1obj2的合并结果,即使obj1obj2b属性都是对象,_.merge()也能正确地合并它们。

1 个回答

出于性能考虑,目前ArkTS限制了ES6的Object.assign()方法的使用。若需要在ets文件中扩展对象属性或合并两个对象时,可以自行实现assign方法。

  1. 自定义assign方法
function assign(target: Record<string, Object>, ...source: Object[]): Record<string, Object> { 
  for (const items of source) { 
    for (const key of Object.keys(items)) { 
      target[key] = Reflect.get(items, key) 
    } 
  } 
  return target; 
}
  1. 使用assign方法
interface IMergeSub { 
  testString: string, 
  testObject?: IMergeSub, 
  testArray?: Array<number> 
} 
 
interface IMerge { 
  a: IMergeSub, 
  b: IMergeSub[], 
  c: string[], 
  d: number 
} 
 
export function testAssign() { 
  let objectOne: IMerge = 
    { 
      a: { 
        testString: 'objectOne-a-testString', 
        testObject: { 
          testString: 'objectOne-a-testObject-testString' 
        }, 
        testArray: [1] 
      }, 
      b: [{ 
        testString: 'objectOne-b-testString', 
        testObject: { 
          testString: 'objectOne-b-testObject-testString' 
        }, 
        testArray: [2] 
      }], 
      c: ['objectOne-c'], 
      d: 3 
    } 
 
  let objectTwo: Record<string, Object> = { 
    'a': 'objectTwo-a', 
    'c': ['objectTwo-c'], 
    'e': 1 
  } 
 
  let objectThree: Record<string, Object> = { 
    'f': ['objectThree-f'] 
  } 
 
  // 合并多个对象,ObjectOne和ObjectTwo的属性都将附加到ObjectThree上,属性名相同时入参下标靠后的对象属性覆盖前面的对象属性 
  const multiObjectMerged = assign(objectThree, objectTwo, objectOne); 
  console.log('multiObjectMerged is:' + JSON.stringify(multiObjectMerged)); 
  console.log('objectThree is:' + JSON.stringify(objectThree)); 
 
  // 合并ObjectOne的属性到ObjectTwo,ObjectTwo的值会改变,属性名称相同时ObjectOne会覆盖ObjectTwo的属性 
  const objectMerged = assign(objectTwo, objectOne); 
  console.log('objectTwo is:' + JSON.stringify(objectTwo)); 
  console.log('objectMerged is:' + JSON.stringify(objectMerged)); 
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进