Normalizr:如何规范化嵌套键并恢复到相同的形状?

Normalizr: How to normalize nested keys and get back to same shape?

这可能用代码更清楚。如果我有这样的回复。

{
  id: "1",
  container: {
    sections: [
      {
        id: "a",
        pages: [
          {
            id: "z"
          }
        ]
      }
    ]
  }
}

我真的很想标准化其中的部分集合和页面集合。我还需要把它恢复到原来的形状。问题是 container 没有 id。我尝试的一切似乎都无法恢复。我想我想要的标准化版本会是这样的。

{
  // the thing that container is in
  project: {  
    id: "1",
    // maybe remove container key, and know I have to normalize
    // and add the key again?
    container: "?"
  },
  sections: {  
    id: "a": {
      pages: ["z"]
    },
  pages: {
    id: "z"
  }
}

如有任何帮助,我们将不胜感激。同样,这些部分和页面确实是我要在不丢失顶级密钥

数据的情况下进行规范化和反规范化的内容

编辑 为了稍微改写这个问题,我发现了像这样的帖子 。那是试图将 id 添加到没有它们的东西。我并不是真的想要那样,因为我不想在相同级别或以上 container 仅在以下

标准化任何东西。

您可以将容器作为项目架构定义的一部分。

const { schema } = require('normalizr');

const pageSchema = new schema.Entity('pages');

const sectionSchema = new schema.Entity('sections', {
    pages: [pageSchema],
});

const projectSchema = new schema.Entity('projects', {
    container: {
        sections: [sectionSchema],
    },
});

在这种情况下,容器不会被规范化。只要它们不具有任何识别属性,就很难将它们视为实体。如果他们这样做了,您可以将 属性 指定为 idAttribute

你最好的选择是转换 API 响应并在 API 和 normalizr 之间的某个级别生成唯一的 id,但它不会给你任何你通过规范化获得的正常好处在您链接的问题中指出。

以下是使用上述模式从规范化状态对实体进行非规范化的方法:

const { normalize, denormalize } = require('normalizr');

const data = {
  id: "1",
  container: {
    sections: [
      {
        id: "a",
        pages: [
          {
            id: "z"
          }
        ]
      }
    ]
  }
};

const state = normalize(data, projectSchema);
// -> {"entities":{"pages":{"z":{"id":"z"}},"sections":{"a":{"id":"a","pages":["z"]}},"projects":{"1":{"id":"1","container":{"sections":["a"]}}}},"result":"1"}    

denormalize(1, projectSchema, state.entities); 
// -> {"id":"1","container":{"sections":[{"id":"a","pages":[{"id":"z"}]}]}}