首页 > 解决方案 > 将对象属性数组减少为嵌套对象

问题描述

我有一个特异性越来越强的数组,例如。

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, {});

标签: javascriptarraysreduce

解决方案


我会推荐一个简单的递归函数,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"
      }
    }
  }
}

推荐阅读