javascript - 将对象属性数组减少为嵌套对象
问题描述
我有一个特异性越来越强的数组,例如。
const locationProperties = ['earth', 'americas', 'canada', 'saskatchewan'];
我想要一个对象:
{
earth: {
americas: {
canada: {
saskatchewan: {
// data
}
}
}
}
}
我正在考虑使用.reduce
来创建对象,但在减速器中应用转换后,我只剩下{}
const reducer = (accumulator, item) => {
accumulator[item] = {};
return accumulator[item];
}
const reducedArray = locationProperties.reduce(reducer, {});
解决方案
我会推荐一个简单的递归函数,nest
-
const nest = ([key, ...more], val) =>
key == null
? val
: {[key]: nest(more, val)}
const loc =
['earth', 'americas', 'canada', 'saskatchewan']
console.log(nest(loc, "something"))
{
"earth": {
"americas": {
"canada": {
"saskatchewan": "something"
}
}
}
}
您还可以使用reduceRight
-
const loc =
['earth', 'americas', 'canada', 'saskatchewan']
const result =
loc.reduceRight((val, key) => ({[key]: val}), "something")
console.log(result)
{
"earth": {
"americas": {
"canada": {
"saskatchewan": "something"
}
}
}
}
由于您熟悉,reduce
我会指出这arr.reduceRight(...)
实际上相当于arr.reverse().reduce(...)
. 但是reduceRight
在这种情况下使用效率更高,并且不会改变输入数组 -
const loc =
['earth', 'americas', 'canada', 'saskatchewan']
const result =
loc.reverse().reduce((val, key) => ({[key]: val}), "something")
console.log(result)
{
"earth": {
"americas": {
"canada": {
"saskatchewan": "something"
}
}
}
}
推荐阅读
- mongodb - MongoDB full text search with pymongo wrong type error
- android - How can i apply theme what is in my mind in the android application
- pine-script - How to Continue BUY or SELL Signals for next trading day as per the trend
- mysql - 在 id 1 上进行全文搜索的奇怪 mysql 行为
- java - the allure testng dependency is giving error
- bitbucket - Can you mirror bitbucket repos with REST API?
- django - 带有 Instagram 基本显示 API 的 Python Social Auth
- akka - Lagom 和 Akka 投影的区别
- android - 如何使用 JSON 格式备份和恢复 Flutter Hive 数据?
- python - 如何在 Django 中过滤多对多关系中的不同对象?