normalizr - Normalizr - 使用嵌套数组规范化对象数组
问题描述
无法理解要使用的架构定义......
用于规范化此数据的架构定义:
[
{
manufacturer: "Foo",
car: ["Foo-s1", "Foo-s2"]
},
{
manufacturer: "Bar",
car: ["Bar-c3", "Bar-c4"]
}
]
到这个形状:
entities: {
manufacturers: {
Foo: {
id: Foo,
cars: ["Foo-s1", "Foo-s2"]
},
Bar: {
id: Bar,
cars: ["Bar-c3", "Bar-c4"]
}
},
cars: {
"Foo-s1": {
id: "Foo-s1",
},
//...etc
}
};
解决方案
您可以尝试这样的事情,但是您需要对原始输入执行一些数据转换。可能有更好的解决方案,这是我想出的。
import { normalize, schema } from 'normalizr';
const originalData = [
{
id: "1",
manufacturer: "Foo",
car: ["Foo-s1", "Foo-s2"],
},
{
id: "2",
manufacturer: "Bar",
car: ["Bar-c3", "Bar-c4"],
}
];
const objectData = originalData.reduce((prev, curr) => {
const updatedData = Object.entries(curr).reduce((obj, [k,v]) => {
if(v.constructor === String && k !== 'id')
return Object.assign({}, obj, {[k]: {'id': v}});
if(v.constructor === Array) {
const arrayData = v.reduce((vPrev, vCurr) => vPrev.concat({'id': vCurr}), []);
return Object.assign({}, obj, {[k]: arrayData});
}
return Object.assign({}, obj, {[k]: v});
}, {});
return prev.concat(updatedData);
}, []);
const manufacturer = new schema.Entity('manufacturers');
const car = new schema.Entity('cars');
const manufactorData = new schema.Entity('manufactorData', {
manufacturer: manufacturer,
car: [car]
});
const normalizedData = normalize(objectData, [manufactorData]);
console.log('Original Data: ', originalData);
console.log('ObjectData: ', objectData);
console.log('Normalized Data: ', normalizedData);
最终结果如下所示:
{
"entities": {
"manufacturers": {
"Foo": {
"id": "Foo"
},
"Bar": {
"id": "Bar"
}
},
"cars": {
"Foo-s1": {
"id": "Foo-s1"
},
"Foo-s2": {
"id": "Foo-s2"
},
"Bar-c3": {
"id": "Bar-c3"
},
"Bar-c4": {
"id": "Bar-c4"
}
},
"manufactorData": {
"1": {
"id": "1",
"manufacturer": "Foo",
"car": [
"Foo-s1",
"Foo-s2"
]
},
"2": {
"id": "2",
"manufacturer": "Bar",
"car": [
"Bar-c3",
"Bar-c4"
]
}
}
},
"result": [
"1",
"2"
]
}
推荐阅读
- ruby-on-rails - 无法使用 init.d 服务启动独角兽 – 无法以 sudo 方式找到捆绑包
- line - 将线段转成弧线,漂亮的运输展示
- html - 我无法使用 css 选择器移动我的图像?
- omnet++ - 在 SUMO 和 OMNeT++ 中创建红绿灯
- xcode - 无法通过 CocoaPods 将分叉库链接到项目
- ios - NEHotspotConfigurationManager 收到此警报:“无法加入网络
" 而错误为零 - java - 使用 java 流从 HashMap 获取特定键
- pandoc - 为什么 pandoc
在 html 到 asciidoc 转换时将“”转换为“+ \n”? - php - 我如何在 Symfony 的订阅者中获取 entityManager
- kubernetes - 如何使用 kubectl 代理访问集群外的服务?