javascript - 如何将嵌套对象展平为对象数组
问题描述
我需要将嵌套对象展平为对象数组。到目前为止,这就是我想出的。但它不能正常工作。目前我正在检查当前元素是否为对象,如果它是我递归调用相同函数的对象。
作为输出我需要这个。
[
{title: 'Foo', value: 111},
{title: 'Bar', value: 222},
...
]
var data = {
1: {
title: "Foo",
value: 111,
children: {
2: {
title: "Bar",
value: 222,
},
},
},
3: {
title: "Baz",
value: 333,
children: {
4: {
title: "Qux",
value: 444,
children: {
5: {
title: "Quux",
value: 555,
},
},
},
},
},
};
const finalArrayOfObjects = [];
const flattenObject = (obj) => {
const flattened = {};
Object.keys(obj).forEach((key) => {
if (typeof obj[key] === "object" && obj[key] !== null) {
flattenObject(obj[key]);
} else {
flattened[key] = obj[key];
}
finalArrayOfObjects.push(flattened);
console.log(flattened);
});
};
解决方案
是时候再次证明 函数式编程和递归的力量了
var data = {
1: {
title: "Foo",
value: 111,
children: {
2: {
title: "Bar",
value: 222,
},
},
},
3: {
title: "Baz",
value: 333,
children: {
4: {
title: "Qux",
value: 444,
children: {
5: {
title: "Quux",
value: 555,
},
},
},
},
},
};
const dictAsArray = Object.values(data);
const flat = [];
function drill(array) {
array.map(obj => {
recursiveCall(obj);
});
}
function recursiveCall(obj) {
if (obj.children) {
const children = JSON.parse(JSON.stringify(Object.values(obj.children)));
delete obj.children;
drill(children);
}
flat.push(obj);
}
dictAsArray.map(dict => recursiveCall(dict));
console.log(flat);
在这种方法中,子对象从每个对象中移除。如果您希望它们保留,您可以简单地删除delete obj.children
.
推荐阅读
- xml - 用于 PPT、PPS 文件的 KODI 配置
- firebase - Flutter:显示来自经过身份验证的 Firebase Auth 用户的带有 StreamBuilder 的一些 Firestore 集合
- android - 如何将存储在数据库中的评分值显示为 Kotlin 中的星数
- c# - 将数据库日期从 nvarchar 编辑为 datetime
- facebook - Facebook Graph IP 过滤
- php - 将两个查询合并为一个查询 Laravel
- docker - K8S 无法从本地仓库拉取镜像
- java - Quarkus 与 openjpa 和其他 lib/框架的兼容性?
- html - 自定义 jekyll 头版,带有从 post 变量中生成的元素。身高问题
- ios - WkWebView 加载后不允许缩放某些网站