Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从数组中生成列表_Javascript - Fatal编程技术网

Javascript 从数组中生成列表

Javascript 从数组中生成列表,javascript,Javascript,在训练中遇到困难。任务是从数组中创建一个列表 列表如下所示: var list = { value: 1, rest: { value: 2, rest: { value: 3, rest: null } } }; 这本书的主要内容是: function arrayToList(array) { var list = null; for (var i = array.length-1; i>=0; i--) {

在训练中遇到困难。任务是从数组中创建一个列表

列表如下所示:

var list = {
  value: 1,
  rest: {
    value: 2,
    rest: {
      value: 3,
      rest: null
    }
  }
};
这本书的主要内容是:

function arrayToList(array) 
{
  var list = null;
  for (var i = array.length-1; i>=0; i--) {
      list = {value: array[i], rest: list};
  }
  return list;
}
我知道它是怎么工作的,但不明白为什么。正如我想象的那样,循环将重写list对象,而其rest属性将指向包含它的对象。有人能解释一下它是如何工作的吗


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

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

对数组进行逐圈遍历
[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}}}
至于打印未定义的
,我不明白为什么,但这是可行的:

函数数组列表(数组)
{
var list=null;
对于(var i=array.length-1;i>=0;i--){
list={value:array[i],rest:list};
}
退货清单;
}
$('#A').html(JSON.stringify(arrayToList([1,2,3]))


test
是的,我理解了这些步骤是如何工作的,以及对象是如何指向彼此的,但是为什么每次都会创建一个新的列表对象,而现有的列表会被放入rest属性中,而不是现有表达式被新表达式覆盖?因为赋值的整个右侧表达式是在实际赋值给左侧变量之前计算/执行的。因此,在构造新对象时,旧对象未被触及,因此可以在构造过程中使用它的值;a=1+a
a
在此之后将为2,其值在计算右侧之前不会更改。
列表
是相同的,我们没有编辑
列表
,我们正在更改它的引用。也就是说,它是对
{value:3,rest:null}
的引用,现在它是对一个新对象
{value:2,rest:{value:3,rest:null}
的引用。希望帮助SSO,您是说创建了第一个
{value:array[i],rest:list}
对象,并将上一个列表放在rest属性中吗?然后才创建一个指向对象的新列表变量?几乎,除了没有新的列表变量。只有一个变量,它会更新以引用新对象。