在Javascript中从数组创建列表对象

时间:2014-12-24 13:26:19

标签: javascript recursion

我从头开始学习Javascript。没有捷径,没有框架,没有。只是简单的Javascript。只是为了它的乐趣,我正在做每一个运动。现在,当我谈到这个问题时:

  

编写一个函数arrayToList,用于构建像

这样的数据结构
var list = {
  value: 1,
  rest: {
    value: 2,
    rest: {
      value: 3,
      rest: null
    }
  }
};

我的代码必须能够满足以下要求:

console.log(arrayToList([10, 20])); 
// → {value: 10, rest: {value: 20, rest: null}} <== expected output which I am sure you know

我试图递归地执行此操作,因为后面的问题要求我们递归地执行此操作(递归是我最薄弱的一点!)。但是,我得到了以下代码:

var list = 
    {
      value: 0,
      rest: null
    }

function arrayToList(array)
{   
  list.value = array.shift();

    if(array.length!=0)
    {
      list.rest = arrayToList(array);
    }
  else
  {
    list.rest = null;
    console.log(list); //this outputs to {value: 20, rest: null}
    return list;
  } 
  return list;
};

然而,输出

{value: 20, rest: {value: 20, rest: {
                                      value:    20
                                      rest: {value: 20, rest: {value: 20, …}}
}}} 

......指的是

的同一块
  

{值:20,休息:{值:20,休息:{...}}

好吧,我没有扩展到最后看(它太长了!(开放后大约20次仍然是相同的)如果有一个结束的话。)

希望有人指导我找到答案。我已经花了几天时间在这上面而且卡住了。

非常感谢,祝大家过得愉快!

2 个答案:

答案 0 :(得分:5)

指导(希望!)

您不需要全局list变量,就像您目前正在使用一样(除非您尝试进行一些复杂的优化 - 暂时不用担心) 。事实上,看起来这个全局list变量正是导致您出现问题的原因。我将尝试从一开始就指导您完成此操作。

首先,尝试确定输出的“重复”部分需要的样子。在您的情况下,重复的部分是:

{
    value: someValue,
    rest: RECURSION
}

因为如果您为上面的SAME结构交换RECURSION,您将获得所需的确切级联效果:

{
    value: someValue,
    rest: {
        value: someValue,
        rest: RECURSION
    }
}

等等。

一旦你确定了这一点,你的函数只需要返回该对象。就这么简单。交换someValue获取该前端值(即arr.shift()的返回值),并交换RECURSION以回调函数,并将其传递给数组的其余部分。这给出了:

function arrayToList(arr) {
    var value = arr.shift();

    return {
        value: value,
        rest: arrayToList(arr) // arr has already had its front value removed, by .shift()
    };
}

唯一要添加的是一个结束条件,所以如果没有剩下的值,递归就会返回null(否则我们将永远循环):

完整解决方案

function arrayToList(arr) {
    if (arr.length === 0) {
        return null;
    }
  
    var value = arr.shift();

    return {
        value: value,
        rest: arrayToList(arr)
    };
}

console.log(arrayToList([10, 20])); // {value: 10, rest: {value: 20, rest: null}}

就是这样!这有意义吗?

答案 1 :(得分:0)

您需要保留已添加的最后一项的列表,因为这将是您添加下一项的项目。

这样的事情:

var list = null;

function arrayToList(array) {
  var last = null;

  for (var i = 0; i < array.length; i++) {
    var item = {
      value: array[i],
      rest: null
    };
    if (last == null)
      list = item;
    else
      last.rest = item;
    last = item;
  }

  return list;
}

console.log(arrayToList([10, 20]));