【问题标题】:Making a list out of an array从数组中创建列表
【发布时间】:2014-11-16 17:35:14
【问题描述】:

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])) 打印出“未定义”

【问题讨论】:

    标签: javascript


    【解决方案1】:

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

    遍历数组[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>

    【讨论】:

    • 是的,我了解这些步骤是如何工作的以及对象如何相互指向,但是为什么每次都会创建一个新的列表对象,并且将现有列表放入 rest 属性,而不是现有的被新的覆盖了吗?
    • 因为赋值的整个右侧表达式在实际分配给左侧变量之前被评估/执行。因此,在构造新对象时,旧对象不会受到影响,因此可以在构造期间使用它的值。
    • 就像var a = 1; a = 1 + a; a 在此之后将是 2,它的值在评估右侧之前不会改变。 list 是一样的,我们不是在编辑 list,而是在更改它的引用。 IE。它是对{value: 3, rest: null} 的引用,现在它是对新对象{value: 2, rest: {value: 3, rest: null}} 的引用。希望有帮助
    • 那么,您是说创建了第一个{value: array[i], rest: list} 对象并将前一个列表放入rest 属性中吗?然后才创建一个指向该对象的新 list 变量?
    • 几乎,除了没有新的列表变量。只有一个变量,它被更新以引用新对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 2021-06-14
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多