如何将像这样的简单数组['foo', 'bar', 'baz']
转换为这样的对象:
{ 'foo': {
'bar': {
'baz' : {}
}
}
}
看起来很简单,但我无法弄明白。
答案 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: { } } }