gpt4 book ai didi

javascript - 如何使用 normalizr 根据实体父项的值通过不同模式规范化数据?

转载 作者:行者123 更新时间:2023-11-30 06:22:28 24 4
gpt4 key购买 nike

我想规范化这种格式的数据:

    [
{
id: 3,
status: "active",
created: "2017-07-03T15:36:11+02:00",
published: "2017-07-03T15:38:07+02:00",
linkables: [
{
data: {
content: "Text content of the linkable",
id: 200
}
linkable_type: "content",
module_id: 3,
module_type: "case_study"
},
{
data: {
content: "https://foobar.wee/url_of_the_media.png",
id: 205
}
linkable_type: "media",
module_id: 3,
module_type: "case_study"
},
]
},
...
]

像这样:

    {
entities: {
contents: {
200: {
content: "Text content of the linkable",
id: 200
}
},
media: {
205: {
content: "https://foobar.wee/url_of_the_media.png",
id: 205
}
},
linkables: {
3_case_study_content_200: {
data: 200, // in the contents key
linkable_type: "content",
module_id: 3,
module_type: "case_study"
},
3_case_study_media_205: {
data: 205, // in the media key
linkable_type: "media",
module_id: 3,
module_type: "case_study"
}
},
caseStudies: {
3: {
id: 3,
status: "active",
created: "2017-07-03T15:36:11+02:00",
linkables: ["3_case_study_content_200", "3_case_study_media_205"]
}
}
},
result: [3]
}

由于这个 PR https://github.com/paularmstrong/normalizr/pull/132,使用 normalizr 的 2.x 版本使这变得容易添加了一个函数,可以用来动态决定在按父对象中的值进行规范化时使用什么方案。

但是,在 3.x.x 版本中,这个附加功能并没有实现。根据docs ,我会说 schemaAttribute 可以完成这项工作。

不幸的是,这段代码并没有给我想要的结果......

    export const caseStudies = new schema.Entity('caseStudies');

export const media = new schema.Entity('media',);
export const content = new schema.Entity('contents');

export const linkablesSchema = new schema.Entity(
'linkables',
{},
{
idAttribute: (itm) => {
const id = itm.data.id;
return `${itm.module_id}_${itm.module_type}_${itm.linkable_type}_${id}`;
}
}
);

export const linkableSchemaMap = {
content,
media
};

caseStudies.define({
linkables: [linkablesSchema]
});


export const lschema = new schema.Array(linkableSchemaMap, (value, parent) => {
return parent.linkable_type; // this would replace the PR mentioned above?
});

linkablesSchema.define({
data: lschema
});

感谢您的帮助!

最佳答案

想到的最直接的方法是在 linkablesSchema 选项中使用 processStrategylinkable_type 值应用为属性:

export const caseStudies = new schema.Entity("caseStudies");
export const mediaSchema = new schema.Entity("media");
export const contentsSchema = new schema.Entity("contents");
export const linkablesSchema = new schema.Entity("linkables", {}, {
idAttribute: itm => `${itm.module_id}_${itm.module_type}_${itm.linkable_type}_${itm.data.id}`,
processStrategy: (value) => ({
...value,
data: value.data.id,
[value.linkable_type]: value.data,
})
});

linkablesSchema.define({
content: contentsSchema,
media: mediaSchema
})

caseStudies.define({
linkables: [linkablesSchema]
});

normalize(data, [caseStudies]);

这是 sandbox .希望对您有所帮助。

关于javascript - 如何使用 normalizr 根据实体父项的值通过不同模式规范化数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52369494/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com