从数组中列出一个列表

时间:2014-11-16 08:50:38

标签: javascript

来自Eloquent Javascript book的练习有问题。任务是从数组中创建一个列表。

列表是这样的:

var list = {
  value: 1,
  rest: {
    value: 2,
    rest: {
      value: 3,
      rest: null
    }
  }
};

这本书的solution on the website是:

function arrayToList(array) 
{
  var list = null;
  for (var i = array.length-1; i>=0; i--) {
      list = {value: array[i], rest: list};
  }
  return list;
}

我理解它是如何工作的,但不明白为什么。正如我想象的那样,循环将重写列表对象,而其rest属性将指向包含它的对象。有人可以解释一下它的工作原理和原因吗?

我也在我的浏览器中试过这个解决方案(Firefox 33),console.log(arrayToList([10,20]))打印出“未定义”

1 个答案:

答案 0 :(得分:4)

它从数组的末尾开始,每次都将前一个结果包装在一个新对象中,这意味着结构越来越深。

尽管它循环遍历数组[1,2,3]

第一个循环:

i = 2
array[2] is 3
list = {value: 3, rest: null}

第二个:

i = 1
array[1] is 2
list = {value: 2, rest: {value: 3, rest: null}}

第三个也是最后一个:

i = 0
array[0] is 1
list = {value: 1, rest: {value: 2, rest: {value: 3, rest: null}}}

至于打印undefined,我不明白为什么,但这有效:

    function arrayToList(array) 
    {
      var list = null;
      for (var i = array.length-1; i>=0; i--) {
          list = {value: array[i], rest: list};
      }
      return list;
    }

    $('#A').html(JSON.stringify(arrayToList([1, 2, 3])));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="A">test</div>