Normalizr和递归嵌套结构

时间:2017-03-31 07:20:16

标签: redux normalizr

我正在使用normalizr来压缩像下面这样的结构:

{
  "fields":[{
    "id":"29",
    "text": "something"
  }, {
    "id":"16",
    "text": "something"
    "fields":[{
      "id":"17",
      "text": "something"
    }]
  }, {
    "id":"18",
    "text": "something"
  }
}

我的结构有一个字段数组,字段也可能有嵌套字段。只允许一级嵌套

我想做的是:

const block = new schema.Entity('fields')
const blockList = new schema.Array(block)

block.define({
  fields: blockList
})

const normalizedData = normalize(originalData, blockList)

运行此代码段后,normalizedData具有结果属性,并且它只有第一级字段ID,即使实体已将所有字段规范化,包括嵌套的。

result of normalize

我想在结果数组中包含所有id,包括嵌套的id。我错过了什么?

2 个答案:

答案 0 :(得分:2)

  

我想在结果数组中包含所有id,包括嵌套的id。我错过了什么?

这就是Normalizr的工作原理。返回的blocks始终采用与输入数据相同的格式。您将无法从Normalizr获得您要求的内容。

但是,如果您只是在寻找entities的列表,请从const blockIds = Object.keys(normalizedData.entities.blocks); 中提取

{{1}}

答案 1 :(得分:0)

您应该考虑在redux中使用normalized form作为数据结构。 如果您的应用程序需要增加复杂性,这是可取的。

有一篇关于redux文档的有趣文章。 http://redux.js.org/docs/recipes/reducers/NormalizingStateShape.html

标准化表单从数据库对应方面获取一些想法,Normalizr以这种方式工作,因此您的请求与Normalizr的工作方式并不完全匹配。

如果您确实需要以这种方式获得blocks,请考虑@Paul Armstrong的答案。