列出JavaScript中的数据结构
在本书中,我需要基于数组[1,2,3]创建一个列表数据结构(如下所示) 本教程介绍了如何执行此操作,但我并不真正理解在本教程中创建列出JavaScript中的数据结构,javascript,Javascript,在本书中,我需要基于数组[1,2,3]创建一个列表数据结构(如下所示) 本教程介绍了如何执行此操作,但我并不真正理解在本教程中创建this.start和this.end变量的意图 var list = { value: 1, rest: { value: 2, rest: { value: 3, rest: null } } }; 我试图通过下面的代码来解决这个问题 function arrayToList(ar
this.start
和this.end
变量的意图
var list = {
value: 1,
rest: {
value: 2,
rest: {
value: 3,
rest: null
}
}
};
我试图通过下面的代码来解决这个问题
function arrayToList(array){
var list = { value:null, rest:null};
for(i=0; i<array.length-1; i++)
list.value = array[i];
list.rest = list;
return list;
}
函数数组列表(数组){
var list={value:null,rest:null};
对于(i=0;i
这说明了如何做到这一点,但我并不真正理解在教程中创建This.start
和This.end
变量的意图
var list = {
value: 1,
rest: {
value: 2,
rest: {
value: 3,
rest: null
}
}
};
本教程使用了一个列表
包装器,将递归结构与一些辅助方法结合起来。它说:“每次需要访问列表的结尾时,通过遍历整个列表,可以避免记录列表的结尾
,但在大多数情况下,存储对列表结尾的引用更经济。”
这段代码为我提供了数组[0]的无限循环
不太可能,但它会创建一个循环引用,引用行为list.rest=list;
。输出列表的代码可能会被这一行阻塞
我的代码怎么了
您需要创建多个对象,在循环体中定义对象文字,而不是一遍又一遍地分配给同一个对象!此外,您应该访问循环中的array[i]
,而不仅仅是array[0]
:
function arrayToList(array){
var list = null;
for (var i=array.length-1; i>=0; i--)
list = {value: array[i], rest:list};
return list;
}
这说明了如何做到这一点,但我并不真正理解在教程中创建This.start
和This.end
变量的意图
var list = {
value: 1,
rest: {
value: 2,
rest: {
value: 3,
rest: null
}
}
};
本教程使用了一个列表
包装器,将递归结构与一些辅助方法结合起来。它说:每次需要访问列表的末尾时,通过遍历整个列表,可以避免记录列表的结尾
,但在大多数情况下,存储对列表末尾的引用更经济。”
这段代码为我提供了数组[0]的无限循环
不太可能,但它会创建一个循环引用,引用行为list.rest=list;
。输出列表的代码可能会被这一行阻塞
我的代码怎么了
您需要创建多个对象,在循环体中定义对象文字,而不是一遍又一遍地分配给同一个对象!此外,您应该访问循环中的array[i]
,而不仅仅是array[0]
:
function arrayToList(array){
var list = null;
for (var i=array.length-1; i>=0; i--)
list = {value: array[i], rest:list};
return list;
}
这种特殊的数据结构更常被称为。递归是处理CONSE的最自然(不一定是最有效)的方法。首先,让我们定义一些辅助函数(使用LISP符号而不是“value/rest”):
现在,要从数组构建cons,请使用以下递归语句:
cons-from-array = cons [ first element, cons-from-array [ the rest ] ]
在Javascript中:
function arrayToList(array) {
if(!array.length)
return null;
return cons(array[0], arrayToList(array.slice(1)));
}
而反向函数也同样微不足道:
function listToArray(list) {
if(!list)
return [];
return [car(list)].concat(listToArray(cdr(list)));
}
这种特殊的数据结构更常被称为。递归是处理CONSE的最自然(不一定是最有效)的方法。首先,让我们定义一些辅助函数(使用LISP符号而不是“value/rest”):
现在,要从数组构建cons,请使用以下递归语句:
cons-from-array = cons [ first element, cons-from-array [ the rest ] ]
在Javascript中:
function arrayToList(array) {
if(!array.length)
return null;
return cons(array[0], arrayToList(array.slice(1)));
}
而反向函数也同样微不足道:
function listToArray(list) {
if(!list)
return [];
return [car(list)].concat(listToArray(cdr(list)));
}
list.value=array[i];
还可以使用index noti
作为变量名,这样更清晰。list.value=array[i];
还可以使用index noti
作为变量名,这样就更清楚了。我理解这段代码是如何工作的。但是你认为如何将数组向后循环而不是向前循环。在这种情况下,向前循环可以工作吗?向前循环可以工作,但需要奇怪的end
指针(在这种情况下是一个变量).最重要的是shift()
从数组中提取第一个元素,然后使用数组尾部的递归调用构建rest
。我理解这段代码是如何工作的。但是您认为如何将数组向后循环而不是向前循环。在这种情况下,前向循环可以工作吗?前向循环可以工作,但需要奇怪的end
“指针”(本例中是一个变量)。最重要的事情是从数组中提取第一个元素shift()
,然后从数组尾部递归调用构建rest
。疯狂但有趣。非常有意义。疯狂但有趣。非常有意义。