在前端开发中,经常需要合并两个或多个 JavaScript 对象。Underscore.js 中提供了 extend
和 assign
方法,可以简单地合并对象。然而,在某些情况下,我们需要进行深度合并,即合并嵌套对象的属性。这时候,我们就需要使用递归/深度扩展(_.extendDeep
)和递归/深度赋值(_.defaultsDeep
)方法。
递归/深度扩展
_.extendDeep
方法可以将一个或多个对象的所有属性进行深度合并。例如:
--- ---- - - ----- -------- -------- - ----- ---- ------ -------- ----- - -- --- ---- - - ---- --- -------- - ------ ----- ---- ------- - -- --- ------ - ------------------ ------ --------------------
输出结果为:
- ----- -------- ---- --- -------- - ----- ---- ------ -------- ------ ------ ----- ---- ------- - -
从上面的示例可以看出,_.extendDeep
方法可以将两个对象的属性进行深度合并,并返回新的对象。如果有相同的属性名,后面的对象会覆盖前面的对象。
下面是 _.extendDeep
方法的实现:
------------ - -------- ------------- ------- - --- ---- -------- -- ------- - -- --------------------------------- - -- ---------------------------------- -- ----------------------------- - --------------------- - ----------------------------------- ------------------ - ---- - --------------------- - ----------------- - - - ------ ------------ --
该方法使用递归方式,遍历所有属性,并将源对象的属性合并到目标对象中。如果属性值是对象,则递归调用 _.extendDeep
方法进行深度合并。
递归/深度赋值
除了扩展对象,有时候我们需要设置对象的默认值。Underscore.js 中提供了 _.defaults
方法,可以将一个或多个对象的属性进行浅层合并。然而,在某些情况下,我们需要进行深度合并,默认值会覆盖原始对象。这时候,我们就需要使用递归/深度赋值(_.defaultsDeep
)方法。
_.defaultsDeep
方法可以将一个或多个对象的所有属性进行深度设置默认值。例如:
--- ---- - - ----- -------- -------- - ----- ---- ------ -------- ----- - -- --- ---- - - ---- --- -------- - ------ ----- ---- ------- - -- --- ------ - -------------------- ------ --------------------
输出结果为:
- ----- -------- ---- --- -------- - ----- ---- ------ -------- ------ ------ ----- ---- ------- - -
从上面的示例可以看出,_.defaultsDeep
方法可以将默认值对象的属性递归地应用于目标对象中。如果属性名在目标对象中不存在,则添加该属性,否则保留目标对象的属性值。
下面是 _.defaultsDeep
方法的实现:
-------------- - -------- ------------- ------- - --- ---- -------- -- ------- - -- --------------------------------- - -- ---------------------------------- -- ----------------------------- - --------------------- - ------------------------------------- ------------------ - ---- -- --------------------------------------- - --------------------- - ----------------- - - - ------ ------------ --
该方法使用递归方式,
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/28884