为啥非规范化不返回嵌套对象?

Posted

技术标签:

【中文标题】为啥非规范化不返回嵌套对象?【英文标题】:Why denormalize not return nested object?为什么非规范化不返回嵌套对象? 【发布时间】:2019-10-11 01:45:20 【问题描述】:

我使用来自normalizr 包的denormalize 作为以下代码:

import  normalize, schema, denormalize  from 'normalizr';

const categoriesData = [
   id: 1, name: 'category-1' ,
   id: 2, name: 'category-2' ,
   id: 3, name: 'category-3' ,
   id: 40, name: 'category-40' ,
];

const subCategoriesData = [
   id: 1, name: 'sub-category-a', category: 1 ,
   id: 2, name: 'sub-category-b', category: 2 ,
   id: 3, name: 'sub-category-c', category: 1 ,
   id: 4, name: 'sub-category-d', category: 3 ,
   id: 500, name: 'sub-category-e', category: 40 ,
]

const category = new schema.Entity('categories');
const categories = new schema.Array(category);

const subcategory = new schema.Entity('subCategories');
const subcategories = new schema.Array(subcategory);

const normalizedData = normalize(categoriesData, categories);
const denormalizedData = denormalize(normalizedData.result, categories, normalizedData.entities);

console.log( normalizedData );
console.log( denormalizedData );

const normalizedData2 = normalize(subCategoriesData, subcategories);
const denormalizedData2 = denormalize(normalizedData2.result, subcategories, normalizedData2.entities);

console.log( normalizedData2 );
console.log( denormalizedData2 );

denormalizedData2 的输出是

id: 1, name: "sub-category-a", category: 1,
...

而我期待的是:

id: 1, name: "sub-category-a", category:  id: 1, name: 'category-1'  ,
...

如何使用normalizr实现目标?

【问题讨论】:

因为这里没有将categoriesData 带入denormalizedData2 的代码。 我编辑我的问题。 【参考方案1】:

老问题,但万一有人需要答案。 您的架构是错误的。 而不是

const subcategory = new schema.Entity('subCategories');

你应该写

const subcategory = new schema.Entity('subCategories', category: category );

这意味着子类别具有category 属性,由category 架构描述。

【讨论】:

以上是关于为啥非规范化不返回嵌套对象?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Symfony 2 序列化器对对象中的嵌套结构进行非规范化

在嵌套对象中使用firestore的FieldPath.documentId()

将非规范化表转换为嵌套结构

为嵌套 XML 生成 XSL(非规范化格式)

如何查询非规范化 BigQuery 表以输出嵌套和重复的字段

使用唯一键展平/规范化深度嵌套的对象