我有一个数组,它是一个键列表:['one', 'two', 'three']
。
我需要生成一个以下格式的对象:
{
path: 'one',
nested: {
path: 'two',
nested: {
path: 'three'
}
}
}
到目前为止,我已经尝试了几种方法,但它们看起来很混乱(我有一种方法使用while(current = array.pop())
但是它需要几个条件来处理第一个和最后一个元素。
是否有更简洁的递归策略?
答案 0 :(得分:6)
您可以使用reduce()
方法和您想要添加属性的累加器传递对象。
var arr = ['one', 'two', 'three']
var obj = {}
arr.reduce(function(r, e, i) {
r.path = e;
return arr[i+1] ? r.nested = {} : r
}, obj)
console.log(obj)
如果你想只使用没有循环的递归,你可以创建这样的函数。
var data = ['one', 'two', 'three']
var obj = {}
function makeObj(arr, n, o) {
if (n == arr.length - 1) o.path = arr[n]
else {
o.path = arr[n];
o.nested = {}
makeObj(arr, n += 1, o.nested)
}
return o.nested
}
makeObj(data, 0, obj)
console.log(obj)
答案 1 :(得分:2)
var arr = ['one', 'two', 'three'];
var tree = arr.reduceRight((nested, path) => {
return nested? {path, nested}: {path};
}, null);
console.log(tree);
甚至更好/更简单,只需:
var arr = ['one', 'two', 'three'];
var tree = arr.reduceRight((nested, path) => ({path, nested}), null);
console.log(tree);
如果所有对象都具有相同的隐藏类(简化:相同的属性名称),它简化了JS引擎的工作。
答案 2 :(得分:0)
let arr = ['one', 'two', 'three'], obj = {};
obj['path'] = arr[arr.length - 1];
for(let i = arr.length - 2; i >= 0; i--) {
obj = {
path: arr[i],
nested: obj
};
}
console.log(obj);
答案 3 :(得分:0)
您可以使用递减的for
循环来解决此问题:
var props = ['one','two','three'],
obj;
for(var a = props.length;a--;) {
var temp = { path: props[a] };
if(obj) {
temp.nested = obj;
}
obj = temp;
}
console.log(obj);