我在Eloquent JavaScript第4章(http://eloquentjavascript.net/04_data.html)中练习3时遇到了这个问题。
基本上,它要我从数组中创建一个嵌套列表。
例如,arrayToList([1,2,3])应返回如下:
var list = {
value: 1,
rest: {
value: 2,
rest: {
value: 3,
rest: null
}
}
};
我的代码与for循环中的正确答案略有不同,但它没有返回预期的结果。
我的代码:
function arrayToList(array) {
var list = {};
list.value = array[array.length - 1];
list.rest = null;
for (var i = array.length - 2; i >= 0; i--) {
list.rest = list;
list.value = array[i];
}
return list;
}
原始答案经过温和修改,使其看起来与我上面的代码更具可比性:
function arrayToList(array) {
var list = {};
list.value = array[array.length - 1];
list.rest = null;
for (var i = array.length - 2; i >= 0; i--)
list = {value: array[i], rest: list};
return list;
}
如您所见,我的代码仅与for循环中的原始答案不同。我想知道为什么我选择操纵对象list
的方式不起作用。
提前谢谢!
答案 0 :(得分:0)
在你的代码中,你正在创建一个无限递归的对象,通过在执行list.rest = list;
时将对象分配给它的一个字段,并且因为你向后走数组,你得到的第一个数组值为{ {1}}在无限递归的对象中;而正确的答案是每次创建一个新对象并使用里面的旧对象。
答案 1 :(得分:0)
我相信当您执行list = something
时,您正在为list.something = anotherthing
设置一种新类型的对象。
使用list
您正在更改列表,但是value
正在修改value
中的字段,而不是它。
使用您的代码,{{1}}只是一个字段,在其他代码中,{{1}}是之前定义的数组,您能看到差异吗?