回答

收藏

如何动态合并两个 JavaScript 对象的属性?

技术问答 技术问答 422 人阅读 | 0 人回复 | 2023-09-11

运行时需要能够合并两个(非常简单)JavaScript 对象。比如我想:
2 {* R! X& L7 T& X& Q5 W( D1 I
    var obj1 = { food: 'pizza',car: 'ford' }var obj2 = { animal: 'dog' }obj1.merge(obj2);//obj1 now has three properties: food,car,and animal5 R2 p+ O+ A( X" |( c3 b. f0 z9 n  n
有没有内置的方法可以做到这一点?我不需要递归或合并函数,只需要平面对象上的方法。3 x+ d) w4 W, T3 N. b
                                                               
3 r; y. ]% M% r" l- \    解决方案:                                                               
9 P2 b6 F9 ?. U, Q* u* x1 W                                                                ECMAScript 2018年 标准方法
" V! C8 O% y. ^' ^8 E: f用对象传播:/ @' T6 Q1 E* T
    let merged = {...obj1,...obj2};
    ; J' R. }7 _, g. l9 k0 C4 o+ m
merged现在是 和 obj1并集obj2。中的属性obj2将覆盖obj1.6 U' s) W* ^* ~* w1 w0 c  w
    /** There's no limit to the number of objects you can merge. *  Later properties overwrite earlier properties with the same name. */const allRules = {...obj1,...obj2,...obj3};
    ) j0 y2 _& x1 `3 n
这也是语法MDN如果使用 文档。babel,你需要babel-plugin-transform-object-rest-spread只有插件才能工作。/ V. q/ T% k" g" Y3 J. S, {% G
ECMAScript 2015 (ES6) 标准方法
! @& r' W% k/ ^8 u* t
    /* For the case in question,you would do: */Object.assign(obj1,obj2);/** There's no limit to the number of objects you can merge. *  All objects get merged into the first object.  *  Only the object in the first argument is mutated and returned. *  Later properties overwrite earlier properties with the same name. */const allRules = Object.assign({},obj1,obj2,obj3,etc);
    ! u5 D* t$ A, g
(见MDN JavaScript 参考)* d- Q# h8 M5 ^! X/ r
ES5 及早版本的方法
  V' f0 Y6 ~+ i8 @/ B6 b8 D
    for (var attrname in obj2) { obj1[attrname] = obj2[attrname]; }0 [6 p# ^9 d9 k5 }0 x
请注意,如果您仍然想使用未修改的产品obj2的.obj1``obj1* {" _4 \9 w8 k7 o
如果你使用的框架在你的原型上是废话,你必须通过类似的检查获得更好的体验hasOwnProperty,但该代码将适用于 99% 。
8 s: I( `3 i! }% q2 @2 p' ?9 F. n示例函数:+ }4 f7 T* R# q4 A) C* b7 ^
    /** * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1 * @param obj1 * @param obj2 * @returns obj3 a new object based on obj1 and obj2 */function merge_options(obj1,obj二、{     var obj3 = {};    for (var attrname in obj1) { obj3[attrname] = obj1[attrname];    for (var attrname in obj2) { obj3[attrname] = obj2[attrname];    return obj3;}* e# a/ f6 A  @1 \. z4 A
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则