我如何轉換一個簡單的數組是這樣的:['foo', 'bar', 'baz']
一個對象是這樣的:轉換數組對象包括
{ 'foo': {
'bar': {
'baz' : {}
}
}
}
這看起來很簡單,但我不能弄明白。
我如何轉換一個簡單的數組是這樣的:['foo', 'bar', 'baz']
一個對象是這樣的:轉換數組對象包括
{ 'foo': {
'bar': {
'baz' : {}
}
}
}
這看起來很簡單,但我不能弄明白。
你應該使用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: { } } }
我想這是你想要的東西:
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']));
你有什麼嘗試?告訴我們你的嘗試。它確實應該是一個簡單的遞歸函數或者向後循環。 – Bergi 2014-08-31 16:56:25