javascript - Normalizr:如何规范嵌套键并恢复到相同的形状?
问题描述
这可能用代码更清楚。如果我有这样的回应。
{
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"
}
}
任何帮助,将不胜感激。再次,这些部分和页面确实是我想要规范化和反规范化的内容,而不会丢失顶级密钥中的数据
编辑
为了稍微改写我发现像这样一个Normalizr 这样的帖子的问题 - 它是一种为非 ids 实体模型生成 ID 的方法吗?. 那是试图将 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"}]}]}}
推荐阅读
- laravel - Laravel Spark 用户字段
- python - python中的修补类不执行模拟对象
- c# - 如何在 Xamarin.Forms UWP 中隐藏默认工具栏按钮(三个点)
- amazon-web-services - 带有 --include 和 --exculde 的 aws s3 cp 不会复制任何内容
- haskell - 用于二叉树的 Haskell 插入函数
- c++ - 我如何知道作为 r 值传递的对象是否会被移动?
- r - 用 R 数据框列中的 NA 替换字符串
- php - 在 Twig 和 PHP 中搜索选定的值
- java - Visual Studio Code:格式化 Java 方法链
- grpc - gRpc 双向流