如何动态合并两个 JavaScript 对象的属性?
技术问答
281 人阅读
|
0 人回复
|
2023-09-11
|
运行时需要能够合并两个(非常简单)JavaScript 对象。比如我想:
0 y4 Q% v# I# Hvar obj1 = { food: 'pizza',car: 'ford' }var obj2 = { animal: 'dog' }obj1.merge(obj2);//obj1 now has three properties: food,car,and animal/ R R3 F \5 g0 { v6 ]
有没有内置的方法可以做到这一点?我不需要递归或合并函数,只需要平面对象上的方法。
! p1 k; w& A# \: T% G% y 9 L7 o. g8 d2 `( H, I
解决方案:
2 t2 M0 j' O& L2 \5 y ECMAScript 2018年 标准方法
: d" b$ y' b' \用对象传播:
A+ A a) `& g0 g4 ? v/ N% h4 ulet merged = {...obj1,...obj2};0 W# {8 X" R/ _
merged现在是 和 obj1并集obj2。中的属性obj2将覆盖obj1.
" s4 W0 b$ {. Z* I/** 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}; a, B' M$ B. `; V, V$ E! ?9 C
这也是语法MDN如果使用 文档。babel,你需要babel-plugin-transform-object-rest-spread只有插件才能工作。' X; w0 z- u2 O& }: M
ECMAScript 2015 (ES6) 标准方法
; @; B2 m5 P2 t6 h5 M/* 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);9 g+ Y7 g3 ^6 \* o0 X p
(见MDN JavaScript 参考)
! T8 v$ [+ W/ E/ G B0 N/ x* pES5 及早版本的方法
( f! r; L; h' K7 u/ e0 v% Lfor (var attrname in obj2) { obj1[attrname] = obj2[attrname]; }
0 _9 p9 C7 s) D: `7 \ 请注意,如果您仍然想使用未修改的产品obj2的.obj1``obj1
* w) V, v, ^/ T2 K5 ~; ^如果你使用的框架在你的原型上是废话,你必须通过类似的检查获得更好的体验hasOwnProperty,但该代码将适用于 99% 。
* d5 o. [2 i& m示例函数:
, A1 b2 e( p# Z S/** * 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;}
, \% x- \% _2 {6 j; n% b |
|
|
|
|
|