【发布时间】:2021-09-23 18:45:02
【问题描述】:
我有一个映射器,它接收任何对象,如果其中有一个名为“字段”的键,它会被它的内容替换。例如,
const obj = { x: 'hey', fields: { y: 'you' } }
const mapped = contentfulMapper(obj);
// mapped = { x: 'hey', y: 'you' }
或者
const givenObj = {
a: "sdf",
w: {
a2: 343,
a3: true,
fields: {
a4: "ll",
q: {
fields: {
a5: [2, 4, "lk"]
},
},
},
},
};
const mapped = contentfulMapper(givenObj);
/* mapped = {
a: "sdf",
w: {
a2: 343,
a3: true,
a4: "ll",
q: {
a5: [2, 4, "lk"]
},
},
}; */
虽然返回 Record<string, unknown> 不是很好,所以我的问题是如何正确输入?
type TContentfulModel = {
fields?: undefined | Record<string, TContentfulModel>;
};
const contentfulMapper = (
obj: Record<string, TContentfulModel | unknown>
) => {
let out: Record<string, unknown> = {};
Object.keys(obj).forEach((key) => {
const field = obj[key] as TContentfulModel;
if (key === 'fields') {
const mappedField = contentfulMapper(field);
out = { ...out, ...mappedField };
} else {
out[key] =
typeof obj[key] === 'object' && !Array.isArray(obj[key])
? contentfulMapper(field)
: obj[key];
}
});
return out;
};
【问题讨论】:
-
这里的想法是它会递归地遍历对象的属性以在任何深度和任何属性下搜索
fields,并将其带到顶部,传播它? -
是的,差不多 - 但不是最高,只是上一层。
标签: javascript typescript types