【发布时间】:2021-03-25 16:25:53
【问题描述】:
我有一个数据映射器函数,它采用 json 和四级数据,然后映射到不同的格式
输入 JSON 格式:
[{
"InventoryLevel2Id": "1234",
"InventoryLevel2Information": "Test Data",
"InventoryLevel2Name": "Test Data",
"InventoryLevel3s": [
{
"InventoryLevel3Id": "5678",
"InventoryLevel3Name": "Inner data at 1",
"InventoryLevel3Information": "Inner info at 1",
"InventoryLevel4s": [
{
"InventoryLevel4Id": "9101112",
"InventoryLevel4Name": "Inner data at 2",
"InventoryLevel4Information": "Inner info at 2",
"InventoryLevel5s": [
{
"InventoryLevel5Id": "131415",
"InventoryLevel5Name": "Inner data at 3",
"InventoryLevel5Information": "Inner info at 3",
}
],
}
]
}
]
}]
输出 JSON 格式:
[{
label1: 'TestData',
label2: "Test data",
uniquieId: "1234",
innerState: {
data : {
label1: 'Inner data at 1',
label2: "Inner info at 1",
uniquieId: "5678",
innerState: {
data: {
label1: 'Inner data at 2',
label2: "Inner info at 2",
uniquieId: "9101112",
innerState: {
data: {
label1: 'Inner data at 3',
label2: "Inner info at 4",
uniquieId: "131415",
}
}
}
}
}
}
}]
为此,我编写了这个映射器函数。这很好用,但我必须一次又一次地调用映射器。为了优化,我正在考虑创建一个递归函数,将其称为 self ,直到完成所有级别的映射。
const dataMapperFunc = (
inputData
) => {
const mappedData = inputData?.map((a) => ({
label1: a.InventoryLevel2Name,
label2: a.InventoryLevel2Information,
uniquieId: a.InventoryLevel2Id,
innerState: {
data: a.InventoryLevel3s?.map((b) => ({
label1: b.InventoryLevel3Name,
label2: b.InventoryLevel3Information,
uniquieId: b.InventoryLevel3Id,
innerState: {
data: b.InventoryLevel4s?.map(
(c) => ({
label1: c.InventoryLevel4Name,
label2: c.InventoryLevel4Information,
uniquieId: c.InventoryLevel4Id,
innerState: {
data: c.InventoryLevel5s?.map(
(d) => ({
label1: d.InventoryLevel5Name,
label2:
d.InventoryLevel5Information,
uniquieId: d.InventoryLevel5Id,
})
),
},
})
),
},
})),
},
}));
return mappedData;
};
这是我对映射器功能的尝试,它在 InventoryLevel3s 处停止并且未完成。我错过了几个步骤,可以做得更好。
const dataMapperFuncTryReccursive = (inputData ) => {
const mappedData = inputData?.map((a) =>
mapper(
a,
"InventoryLevel2Name",
"InventoryLevel2Information",
"InventoryLevel3Id",
"InventoryLevel3s"
)
);
return mappedData;
};
const mapper = (entity, field1, field2, uniquieId, childEntityName) => {
if (entity) {
return {
label1: entity[field1],
label2: entity[field2],
uniquieId: entity[uniquieId],
concurrencyId: entity.concurrencyId,
innerState: {
data: entity[childEntityName]?.map((innerData) =>
mapper(
innerData,
"InventoryLevel3Name",
"InventoryLevel3Information",
"InventoryLevel3Id",
"InventoryLevel4s"
)
),
},
};
}
};
【问题讨论】:
-
为什么
data元素在innerState中有额外的嵌套级别?这似乎没有必要,因为它是唯一的。 -
每个级别可以有多个值吗?样本数据只有一个。
-
@Nick,是的,每个级别可以有多个值。每个级别都是一个数组。而且,同意,我们不需要内部状态中的数据。
标签: javascript typescript recursion callback