[英]How to flatten nested objects in Typescript?
我正在尝试将以下 object 'raw' 展平为 object 'flat'
raw = [ {
"id":"123",
"Date":"12/12/2020",
"Type":{
"id":"456",
"desc":"test1"
} }, {
"id":"124",
"Date":"12/12/2020",
"Type":{
"id":"456",
"desc":"test2"
} } ]
flat =[ {
"id":"123",
"Date":"12/12/2020",
"desc":"test1"
},
{
"id":"124",
"Date":"12/12/2020",
"desc":"test2"
}]
我尝试了以下操作:
let flatData:any = []
const flattenObject = (obj:any) => {
const flattened:any = {}
Object.keys(obj).forEach((key) => {
if (typeof obj[key] === 'object' && obj[key] !== null) {
Object.assign(flattened, flattenObject(obj[key]))
} else {
flattened[key] = obj[key]
}
})
flatData.push(flattened)
console.log(flattened)
return flattened
}
结果我从上面的代码片段中得到。
..................................................... .........................................................
您可以在 TypeScript 中使用object 解构。
const raw = [{ "id": "123", "Date": "12/12/2020", "Type": { "id": "456", "desc": "test1" } }, { "id": "124", "Date": "12/12/2020", "Type": { "id": "456", "desc": "test2" } }]; const mapped = raw.map(({ id, Date, Type: { desc } }) => ({ id, Date, desc })); console.log(mapped);
.as-console-wrapper { top: 0; max-height: 100%;important; }
您用于展平 object 的 function 是正确的,但是Type
属性中的嵌套id
属性与顶级id
属性具有相同的属性名称。 当您展平 object 时,该顶级id
值将被嵌套的id
值覆盖。
解决方案:
id
属性重命名为其他名称。flattenObject
function 中,您可以使用父属性名称作为嵌套属性的前缀。 IEconst flattenObject = (obj:any, prefix = '') => {
const flattened:any = {}
Object.keys(obj).forEach((key) => {
if (typeof obj[key] === 'object' && obj[key] !== null) {
Object.assign(flattened, flattenObject(obj[key], prefix))
} else {
flattened[prefix + key] = obj[key]
}
})
flatData.push(flattened)
return flattened
如果您只有一个深度级别并且想要展平对象,无论属性名称是什么,这是一个有效的解决方案:
const raw = [ { id: "123", Date: "12/12/2020", Type: { id: "456", desc: "test1", }, }, { id: "124", Date: "12/12/2020", Type: { id: "456", desc: "test2", }, }, ]; const flatten = (obj) => Object.assign( {}, Object.fromEntries( Object.values(obj).filter((x) => typeof x === "object").map((x) => Object.entries(x)).flat(1) ), Object.fromEntries( Object.entries(obj).filter(([, x]) => typeof x;== "object") ) ). const compute = (data) => data;map(flatten). console;log(compute(raw));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.