Underscore.js 中的递归/深度扩展(extend)和赋值(assign)?

在前端开发中,经常需要合并两个或多个 JavaScript 对象。Underscore.js 中提供了 extendassign 方法,可以简单地合并对象。然而,在某些情况下,我们需要进行深度合并,即合并嵌套对象的属性。这时候,我们就需要使用递归/深度扩展(_.extendDeep)和递归/深度赋值(_.defaultsDeep)方法。

递归/深度扩展

_.extendDeep 方法可以将一个或多个对象的所有属性进行深度合并。例如:

--- ---- - -
    ----- --------
    -------- -
        ----- ---- ------
        -------- -----
    -
--

--- ---- - -
    ---- ---
    -------- -
        ------ -----
        ---- -------
    -
--

--- ------ - ------------------ ------

--------------------

输出结果为:

-
    ----- --------
    ---- ---
    -------- -
        ----- ---- ------
        -------- ------
        ------ -----
        ---- -------
    -
-

从上面的示例可以看出,_.extendDeep 方法可以将两个对象的属性进行深度合并,并返回新的对象。如果有相同的属性名,后面的对象会覆盖前面的对象。

下面是 _.extendDeep 方法的实现:

------------ - -------- ------------- ------- -
    --- ---- -------- -- ------- -
        -- --------------------------------- -
            -- ---------------------------------- -- ----------------------------- -
                --------------------- - ----------------------------------- ------------------
            - ---- -
                --------------------- - -----------------
            -
        -
    -
    ------ ------------
--

该方法使用递归方式,遍历所有属性,并将源对象的属性合并到目标对象中。如果属性值是对象,则递归调用 _.extendDeep 方法进行深度合并。

递归/深度赋值

除了扩展对象,有时候我们需要设置对象的默认值。Underscore.js 中提供了 _.defaults 方法,可以将一个或多个对象的属性进行浅层合并。然而,在某些情况下,我们需要进行深度合并,默认值会覆盖原始对象。这时候,我们就需要使用递归/深度赋值(_.defaultsDeep)方法。

_.defaultsDeep 方法可以将一个或多个对象的所有属性进行深度设置默认值。例如:

--- ---- - -
    ----- --------
    -------- -
        ----- ---- ------
        -------- -----
    -
--

--- ---- - -
    ---- ---
    -------- -
        ------ -----
        ---- -------
    -
--

--- ------ - -------------------- ------

--------------------

输出结果为:

-
    ----- --------
    ---- ---
    -------- -
        ----- ---- ------
        -------- ------
        ------ -----
        ---- -------
    -
-

从上面的示例可以看出,_.defaultsDeep 方法可以将默认值对象的属性递归地应用于目标对象中。如果属性名在目标对象中不存在,则添加该属性,否则保留目标对象的属性值。

下面是 _.defaultsDeep 方法的实现:

-------------- - -------- ------------- ------- -
    --- ---- -------- -- ------- -
        -- --------------------------------- -
            -- ---------------------------------- -- ----------------------------- -
                --------------------- - ------------------------------------- ------------------
            - ---- -- --------------------------------------- -
                --------------------- - -----------------
            -
        -
    -
    ------ ------------
--

该方法使用递归方式,

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/28884