列出JavaScript中的数据结构

列出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

在本书中,我需要基于数组[1,2,3]创建一个列表数据结构(如下所示)

本教程介绍了如何执行此操作,但我并不真正理解在本教程中创建
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 not
i
作为变量名,这样更清晰。
list.value=array[i];
还可以使用index not
i
作为变量名,这样就更清楚了。我理解这段代码是如何工作的。但是你认为如何将数组向后循环而不是向前循环。在这种情况下,向前循环可以工作吗?向前循环可以工作,但需要奇怪的
end
指针(在这种情况下是一个变量).最重要的是
shift()
从数组中提取第一个元素,然后使用数组尾部的递归调用构建
rest
。我理解这段代码是如何工作的。但是您认为如何将数组向后循环而不是向前循环。在这种情况下,前向循环可以工作吗?前向循环可以工作,但需要奇怪的
end
“指针”(本例中是一个变量)。最重要的事情是从数组中提取第一个元素
shift()
,然后从数组尾部递归调用构建
rest
。疯狂但有趣。非常有意义。疯狂但有趣。非常有意义。