将数组转换为包含对象

时间:2014-08-31 16:47:36

标签: javascript arrays object

如何将像这样的简单数组['foo', 'bar', 'baz']转换为这样的对象:

{ 'foo': {
    'bar': {
      'baz' : {}
    }
  }
}

看起来很简单,但我无法弄明白。

2 个答案:

答案 0 :(得分:2)

我认为这就是你想要的:

function arrayToNestedObject(arr) {
    var obj = {},
        current = obj;

    for(var i = 0; i < arr.length; i++) {
        var key = arr[i];
        current = current[key] = {};
    }

    return obj;
}

console.log(arrayToNestedObject(['foo', 'bar', 'baz']));

答案 1 :(得分:1)

您应该使用Array#reduceRight

function arrayToNestedObject(arr) {

    // Proceeding from the end of the array back towards the beginning...
    return arr.reduceRight(function(prev, cur) { 

        // Create a new object with a property named by the array element,
        // whose value is what we have got so far
        return Object.defineProperty({}, cur, {value: prev});

    }, {});
}

测试:

arrayToNestedObject(['foo', 'bar', 'baz']
> {foo: {bar: {baz: {} } } }

请注意,Object.defineProperty({}, prop, {value: val})

的便捷单行速记
var x = {};
x[prop] = val;
return x;

在ES6中,使用“计算属性”,上面只是

arrayToNestedObject = (arr) => arr.reduceRight((prev, cur) => ({[cur]: prev}));

如果有人更喜欢递归解决方案,最好从右侧开始,使用pop

function arrayToNestedObject(arr) {
    return (function _(arr, obj) {
      var val = arr.pop();
      return val ? _(arr, Object.defineProperty({}, val, {value: obj})) : obj;
    }(arr, {}));
}

arrayToNestedObject(['foo', 'bar'])
> { foo: { bar: { } } } 
相关问题