function arrayToList(array){
LIST = {};
function add(list, index){
if(index < array.length){
list = {value:array[index], rest : null};
add(list.rest, index+1);
}
}
add(LIST,0);
return LIST;
}
答案 0 :(得分:6)
您的代码就像JavaScript是一种传递引用语言一样。事实并非如此。
具体来说,在add()
函数中,您的代码被编写为好像对参数list
进行赋值会对作为参数传递给函数的内容产生影响;它不会。也就是说,这句话:
list = {value:array[index], rest : null};
将修改参数的值,但不会影响全局变量LIST
。
您可以通过不同的方式重新设计代码。这是一种方式:
function arrayToList(array){
function add(index){
var entry = null;
if (index < array.length) {
entry = { value: array[index], rest: add(index + 1) };
}
return entry;
}
return add(0);
}
答案 1 :(得分:1)
首先,您需要在var
前面拍一个LIST
,这样就不会创建全局变量。
function arrayToList(array) {
var LIST = {};
...
}
接下来,问题是当您传入list.rest
时,您没有传递对该属性的引用。你刚刚传递了null
的值。相反,您可能希望尝试在最后创建节点,但将值设置为null
。
function arrayToList(array) {
var LIST = {};
function add(list, index) {
if (index < array.length) {
list.value = array[index];
list.rest = {};
add(list.rest, index + 1);
} else {
list.rest = list.value = null;
}
}
add(LIST, 0);
return LIST;
}
修改:或者如果您想确定结尾是null
,您可以在add
函数内执行简单检查。
function add(list, index) {
if (index < array.length) {
list.value = array[index];
if (index + 1 < array.length) {
list.rest = {};
add(list.rest, index + 1);
} else {
list.rest = null;
}
}
}