基于数组生成的递归对象

时间:2017-07-05 16:13:26

标签: javascript

我有一个数组,它是一个键列表:['one', 'two', 'three']

我需要生成一个以下格式的对象:

{
  path: 'one',
  nested: {
    path: 'two',
    nested: {
      path: 'three'
    }
  }
}

到目前为止,我已经尝试了几种方法,但它们看起来很混乱(我有一种方法使用while(current = array.pop())但是它需要几个条件来处理第一个和最后一个元素。

是否有更简洁的递归策略?

4 个答案:

答案 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);




相关问题