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