npm 包 object-map-transformer 使用教程

阅读时长 9 分钟读完

简介

object-map-transformer 是一个 Node.js 的 npm 包,用于实现 JavaScript 中对象的转换,可以方便地将一个对象映射为另一个对象,比如对象的 Key 或 Value 进行格式、类型转换等操作。

此工具包的核心理念是在保留对象原有数据结构的基础上,实现对对象内容的定向转换。其官方 GitHub 地址为:https://github.com/eggjs/videos/blob/master/object-map-transformer.md。

安装

在使用 object-map-transformer 前,您需要先确保安装了 Node.js 环境和 npm 包管理工具。在 Linux 或 macOS 系统下,您可以在终端中执行以下命令来安装 object-map-transformer

当然,在 Windows 系统下,您只需要在命令行中执行相同的命令即可安装此工具包。

使用

接下来,我们来看一下 object-map-transformer 如何实现一个对象转换的过程。

基础

我们考虑如下场景,在程序中,我们需要对一个对象进行数据类型转换,将对象中的所有数值类型转换为字符串类型,同时删除对象中的空格。如何实现呢?

我们可以首先定义一个原始对象,代码如下所示:

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

我们希望将 person 对象中的所有数值类型转换为字符串类型,同时删除对象中的空格。我们可以定义一个转换规则,代码如下所示:

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

在上面的代码中,我们针对 person 对象中的每个 Key 都对应了一个 Value,而这个 Value 对应的是转换后的 Key。当我们遇到不需要转换的 Key 时,我们可以使用 ‘*’ 占位符,表示不变。

接下来,我们可以调用 transformObject 函数来转换 person 对象。代码如下所示:

运行后输出结果如下所示:

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

深度对象转换

上面的例子中,我们演示了一个较为简单的对象转换,主要针对对象的一级属性。但在实际场景中,对象往往是有层级结构的,比如对象中包含了另一个对象。我们可以通过定义多个 mapRule,来完成对于多级对象的转换。

下面让我们看一个例子,考虑如下场景。我们有一个多级对象,其中包含了数组和对象嵌套等复杂结构。一级 Key 命名规则如下:

  • 名称:string
  • 年龄:number
  • 联系方式:object
  • 住址:object
  • 省份:string
  • 城市:string
  • 区县:string
  • 详细地址:string
  • 特殊要求:array

我们需要将其转换为另一个对象,其中:

  • 姓名、年龄、联系方式直接映射
  • 住址映射为省份、城市、区县、详细地址,每个都是 string 类型
  • 特殊要求映射为一个字符串,内容为每个元素的描述,都用分号分隔

我们可以分别定义两个转换规则:mapRule1mapRule2。代码如下所示:

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

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

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

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

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

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

上述代码中,mapRule1 定义了一级 Key 对应的二级 Key,用于表示层级结构。而 mapRule2 与我们之前的转换规则有所不同,具体来说,这是一种名为 Mapping Function 的规则,即可以使用一个函数,通过编写某些逻辑来完成转换。

运行代码后的输出结果如下所示:

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

我们可以看到,我们成功地完成了对于 person 对象的转换,得到了转换后的 newPerson。具体而言,我们通过两个 Map 规则,实现了各级 Key 的对象映射,同时使用 Mapping Function 完成了特殊要求的转换。

进阶

在我们逐渐熟悉了 object-map-transformer 的使用方法后,我们可以探究更多的高级功能,比如从源对象获取到指定的值后再进行转换等。

我们可以使用一个工厂函数 createMappingRule,来定义更为灵活的规则。代码如下所示:

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

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

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

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

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

上述代码中,我们创造了一个 myRule 对象,其中定义了以 sourceObj 为源对象进行转换的规则。我们可以看到,这个规则相较于之前的示例更为灵活,可以根据源对象的具体值来进行转换。

特别地,源对象中并不拥有 e 属性,但是我们通过 myRule 对象的定义,仍然可以在新对象中看到它。这是因为在我们对于不存在的属性进行映射时,object-map-transformer 不会自动附加该属性,而是需要由映射函数来完成逻辑。

总结

在本文中,我们介绍了 object-map-transformer 这一 npm 工具包。我们从基础的对象转换入手,到在对于多级对象的转换方法进行了详细的介绍。最后,我们还讨论了几个高阶用法,包括使用 Mapping Function 和 createMappingRule 创建更为灵活的规则。

通过本文的学习,相信读者能够更好地掌握 object-map-transformer 工具包的技术细节,同时能够在 JavaScript 项目中快速转换对象,提升编码效率和质量。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60055da281e8991b448db5d6

纠错
反馈