如何从路径(键数组)创建嵌套对象结构?

时间:2017-03-28 05:02:20

标签: javascript arrays string object javascript-objects

我正在尝试创建一些带有字符串数组的东西,然后构建嵌套对象链,这些对象基本上存储了输入数组中的字符串。最初,这些链的深度为2,但我需要能够生成更高深度的链。

基本上,我需要采用这样的数组:

["test1", "test2", "test3", "test4"]

并将其转换为:

{
    "test1":
    {
        "test2":
        {
            "test3":
            {
                "test4": {}
            }
        }
    }
}

2 个答案:

答案 0 :(得分:4)

这看起来像是Array#reduce的工作:



function objectFromPath (path) {
  var result = {}
  
  path.reduce(function (o, k) {
    return (o[k] = {})
  }, result)
  
  return result
}

var path = ["test1", "test2", "test3", "test4"]

console.log(objectFromPath(path))

.as-console-wrapper { min-height: 100%; }




答案 1 :(得分:0)

我想解决一个类似的问题,但我想在结果对象中的路径末尾设置一个值,并且我想提供一个初始对象。我从 gyre 的函数开始,并添加了一些额外的魔法来满足我的用例。

// Creates a nested object from an array representing the path of keys
//
// Takes 2 optional arguments:
//     - a value to set at the end of the path
//     - an initial object
// 
// Ex: let house = objectFromPath(['kitchen', 'fridge'], 'empty', {civic: 123})
//     => house = {civic: 123, kitchen: {fridge: 'empty'}}
const objectFromPath = (path, value = {}, obj = {}) =>
{
    path.reduce((result, key, i, source) =>
        {
            if(i === (source.length - 1))
            {
                return (result[key] = value)
            }
            else
            {
                return (result[key] = {})
            }
        },
        obj
    )
    
    return obj;
}


// Demo: house = {civic: 123, kitchen: {fridge: 'empty'}}
console.log(
  objectFromPath(
    ['kitchen', 'fridge'],
    'empty',
    {civic: 123}
  )
)