Normalizr 和递归嵌套结构

Normalizr and recursive nested structure

我正在使用 normalizr 来展平结构,如下所示:

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

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

我想做的是:

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

block.define({
  fields: blockList
})

const normalizedData = normalize(originalData, blockList)

在 运行 这个片段之后,normalizedData 有一个 results 属性 并且它只有第一级字段 ID,即使 entities 规范化了所有字段,包括嵌套字段。

我想在 results 数组中包含所有 ID,包括嵌套 ID。我错过了什么?

I'd like to have in the results array all the ids, including the nested ones. What am I missing?

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

但是,如果您只是查找 blocks 的列表,请从 entities:

中提取该列表
const blockIds = Object.keys(normalizedData.entities.blocks);

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

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

规范化形式从 db 对应方那里汲取了一些想法,Normalizr 以这种方式工作,因此您的请求与 Normalizr 的工作方式并不完全匹配。

如果您确实需要以这种方式获取 blocks,请考虑@Paul Armstrong 的解决方法。