npm 包 entman-denormalizr 使用教程

在前端开发过程中,经常需要处理嵌套复杂的数据结构。entman-denormalizr 是一个实用的 npm 包,用于将嵌套结构的数据 flatten(扁平化)并进行规范化,方便管理、使用以及展示。

该包的核心是 denormalize 函数,用法如下:

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

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

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

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

输出:

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

从使用效果可以看到,原本嵌套复杂的数据结构被转换为了扁平的层级结构,读者也许会觉得很神奇,但事实上是个基本的数据转换过程,其中也蕴藏着一些微妙的计算过程,例如对象引用、循环引用、对象更新等一些处理。

接下来,我们将详细介绍如何使用 entman-denormalizr 包,并结合示例代码进行说明和演示。

使用场景

首先,我们来看一下 entman-denormalizr 包适用的场景。如果你有以下情况,可以尝试使用本包:

  • 后端返回的数据格式结构嵌套,让你难以处理、阅读和使用。
  • 多条数据之间有引用关系(如同一用户的多篇文章),但是这些关系没有直接反映在每条数据中,使用起来不方便。
  • 想要快速地查询某个特定属性(比如按用户 id 进行查询),但是因为嵌套结构太复杂,查询效率受到影响。

针对以上问题,在 entman-denormalizr 中,我们提供了以下两个核心函数:

  • normalize:用于把一个扁平化结构的对象(包括数组)转换为一个带关系的嵌套结构,并且每个数据项都有一个唯一的 id。
  • denormalize:用于把一个带有关系的嵌套结构转换为扁平化结构,并根据 id 建立小的对象关系。

其中,normalize 可以理解为把后端数据转换为前端更容易使用的结构,而 denormalize 则是把前端使用的结构转换为方便传输的结构。两者均需要注意数据关系的嵌套、索引和更新等问题。

使用步骤

下面我们来介绍一下如何使用 entman-denormalizr 包实现数据的扁平化与规范化。

步骤一:安装依赖

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

步骤二:定义数据结构

首先我们需要定义原始数据结构,从而方便我们在 denormalize 函数中使用。我们以只有一篇文章、一条评论和一个用户的数据为例:

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

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

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

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

其中,我们把 author、post 和 comment 分别放在一个对象中,并用唯一的 id 标识,从而方便后续的处理。

步骤三:扁平化数据

接下来,我们可以使用 normalize 函数把数据扁平化:

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

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

这里 normalize 函数将 data 数据按照 author、post 和 comment 进行划分,并通过递归方式扁平化每个数据项的属性关系,最终把所有子属性都添加到 normalizedData 对象中,如下所示:

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

其中,normalizedData.entities 中包含了每个实体的所有属性值,normalizedData.result 中包含了每个实体的唯一 id。

步骤四:规范化数据

使用 normalize 函数得到 normalizedData 后,我们可以把该数据规范化(denormalize)为一个我们熟悉的 JavaScript 对象,方便我们在前端展示或使用。我们以 denormalize 带两个参数的用法(entities 和 result)为例:

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

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

通过 denormalize 函数,我们得到了 denormalizedData 数据(就是 normalize 前的 data),如下所示:

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

可以看到,我们得到了原始的数据结构,其中引用关系已被展开,但是由于缺乏 author 的 name 属性,因此未能展示完整数据。当然,在日常开发中,我们很少会出现基本属性没有被 denormalize 的情况,这是由于 normalizedData 建立在源数据之上的过程中,实体对象已经获得了完整的属性,所以在 denormalize 的过程中,完整数据也将被建立起来。

步骤五:使用结果数据

最后,我们可以在前端代码中使用 denormalizedData 数据结构,进行展示和数据处理操作。

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

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

总结

本文介绍了 npm 包 entman-denormalizr 的使用方式,通过 normalize 和 denormalize 两个函数分别实现了数据结构的扁平化和规范化。扁平化的数据易于传输、索引和查询,规范化的数据易于展示和使用。通过本文的介绍和示例,读者可以更好地理解 entman-denormalizr 的工作原理,掌握如何使用该包解决前端数据结构处理中遇到的问题。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/600671a730d0927023822626


猜你喜欢

  • npm 包 @ajreed79/react-input-mask 使用教程

    简介 在前端开发中,我们经常需要对用户输入的数据进行格式控制,例如电话号码、日期、货币等等。而在实现这些功能时,常常需要使用到输入掩码(Input Mask)控制。

    4 年前
  • npm 包 lesson-plan-wd 使用教程

    简介 lesson-plan-wd 是一个适用于前端项目的学习计划模板,包含了一份基础的计划表,以及用于生成学习报告的命令行工具。该项目通过使用 TypeScript 进行开发,并且支持 npm 管理...

    4 年前
  • npm 包 report-menu-manage-public-template 使用教程

    介绍 report-menu-manage-public-template 是一个前端模板库,用于生成业务报表管理页面中的菜单和表单,方便开发人员快速构建相关页面。

    4 年前
  • npm 包 sharepoint-extractor 使用教程

    介绍 在前端开发中,我们经常需要从 SharePoint 上获取数据。而 SharePoint 中的数据格式比较复杂,需要一定的技术能力才能从中提取出我们需要的数据。

    4 年前
  • npm 包 gatsby-source-modular-graphql 使用教程

    介绍 gatsby-source-modular-graphql 是一款适用于 gatsby 的 graphql 数据源插件,它可以方便地从任何 graphql api 数据源中获取数据并在你的网站中...

    4 年前
  • npm 包 @agama/http 使用教程

    介绍 在前端开发中,经常需要与后端进行数据交互,而 HTTP 是一个常用的协议。@agama/http 是一个基于 XMLHttpRequest 封装的 HTTP 请求库。

    4 年前
  • 介绍 npm 包 scuba 的使用教程

    什么是 scuba? scuba 是一个 npm 包,它是一个针对前端性能分析的工具。使用 scuba,您可以分析您的网站或应用程序的性能并获取关于这些性能的详细信息。

    4 年前
  • npm 包 api-mock-cli 使用教程

    随着前端开发规模不断扩大,越来越多的后端接口需要前端开发人员进行联调,但受到诸多因素的限制,往往无法及时获取到后端接口文档或者接口尚未完成,这时候就需要使用一些工具来自我 mock 后端接口数据。

    4 年前
  • npm 包 firesoon-lint 使用教程

    简介 firesoon-lint 是一个基于 ESLint 的前端代码质量检查工具,其设计灵感来源于 standard。和 standard 不同的是,firesoon-lint 的检查规则更加严格,...

    4 年前
  • npm 包 stlnode 使用教程

    简介 stlnode 是一款简单易用的 node.js 库,它的主要功能是将 STL 格式的 3D 模型文件解析为 JavaScript 对象,并提供了一些方便的方法来处理这些对象。

    4 年前
  • npm 包 @panter/simpl-to-graphql-schema 使用教程

    介绍 @panter/simpl-to-graphql-schema 是一个 npm 包,它可以将一个简单的 JSON schema 转换成一个 GraphQL schema。

    4 年前
  • npm 包 balena-certificate-client 使用教程

    在前端开发中,有时需要使用 balena-certificate-client 这个 npm 包进行证书认证操作。本文将详细介绍如何使用此包,并附上具体的代码示例,以帮助读者在实际项目中快速上手。

    4 年前
  • npm 包 books-cli 使用教程

    npm 包 books-cli 使用教程 前言 在前端开发过程中,常常需要进行一些文档阅读和资料收集的工作来提高自己的技术水平。然而,随着资料越来越多,如何高效地管理这些资料也成为了一个难题。

    4 年前
  • npm 包 instant-vuetify-overlays 使用教程

    简介 instant-vuetify-overlays 是一个基于 Vue.js 和 Vuetify UI 框架构建的可定制的响应式覆盖层组件库,可以轻松地在 Vue.js 项目中添加各种弹出窗口、加...

    4 年前
  • npm 包 vue-stone 使用教程

    前言 在前端开发中,我们经常需要使用一些优秀的工具包来简化开发流程,提升开发效率。而在这些工具包中,npm 包是前端开发中不可或缺的一部分。 而在众多的 npm 包中,vue-stone 是一个非常优...

    4 年前
  • npm 包 @limejs/cli 使用教程

    在前端开发中,使用一些工具和框架可以大大提高开发效率和代码质量。其中,npm 包 @limejs/cli 是一个非常优秀的命令行工具,它可以帮助我们快速搭建 LimeJS 游戏开发环境。

    4 年前
  • npm 包 html-select2 使用教程

    简介 html-select2 是一款基于 jQuery 的下拉框插件,它支持多选、异步加载数据等功能,并且 UI 界面友好,非常易用。在前端开发过程中,下拉列表是一个必不可少的组件。

    4 年前
  • 使用 postcss-preload-hovers 加载预加载悬停效果图片

    众所周知,优秀的用户界面设计需要丰富的交互效果。其中,鼠标悬停效果无疑是重要的一环,它能让用户通过视觉和触觉体验某种特效,提高用户体验和产品感知度。本文介绍一个 npm 包,名叫 postcss-pr...

    4 年前
  • npm 包 ionic-unlock-it-package 使用教程

    前言 Ionic 是一个基于 Angular 的开源移动应用程序框架,旨在帮助开发人员快速构建精美的移动应用程序。考虑到 Ionic 的默认锁定屏幕可以让用户体验变得更差,因此我们提供了一个 npm ...

    4 年前
  • npm 包 lime-cli 使用教程

    在前端开发中,我们经常会使用各种工具来提高工作效率。其中,npm 是前端开发中必备的一个工具,它可以方便地管理各种包和依赖,从而简化我们的开发流程。在 npm 中,还有很多有用的包,如今天要介绍的这个...

    4 年前

相关推荐

    暂无文章