雄辩的Javascript列表返回未定义的,为什么?

雄辩的Javascript列表返回未定义的,为什么?,javascript,object,data-structures,Javascript,Object,Data Structures,任务 单子 对象作为值的通用blob,可用于构建各种数据结构。一种常见的数据结构是列表(不要与数组混淆)。列表是一组嵌套的对象,第一个对象包含对第二个对象的引用,第二个对象包含对第三个对象的引用,依此类推 变量列表={ 价值:1, 其余:{ 价值:2, 其余:{ 价值:3, rest:null } } }; 结果对象形成一个链,如下所示: 链表 列表的一个优点是它们可以共享其结构的一部分。例如,如果我创建两个新值{value:0,rest:list}和{value:-1,rest:list}(

任务


单子

对象作为值的通用blob,可用于构建各种数据结构。一种常见的数据结构是列表(不要与数组混淆)。列表是一组嵌套的对象,第一个对象包含对第二个对象的引用,第二个对象包含对第三个对象的引用,依此类推

变量列表={ 价值:1, 其余:{ 价值:2, 其余:{ 价值:3, rest:null } } }; 结果对象形成一个链,如下所示:

链表 列表的一个优点是它们可以共享其结构的一部分。例如,如果我创建两个新值{value:0,rest:list}和{value:-1,rest:list}(list引用前面定义的变量),它们都是独立的列表,但它们共享组成最后三个元素的结构。此外,原始列表仍然是有效的三元素列表

编写一个函数arrayToList,在给定[1,2,3]时,它可以像前面的函数一样构建数据结构


总体目标是创建一个创建列表结构的函数,如“数据结构”一章中练习“列表”中所述

function arrayToList(array){
  var list = {};
  var i = 0;
  var rest = ((i < array.length) ? (i++,{value: array[i],rest: rest}): null) ;
  list = {
    value: array[0],
    rest: rest
  }
  return list;
}
函数数组列表(数组){
var list={};
var i=0;
var rest=((i

我希望实现的是使用rest变量调用自身,直到变量I大于数组长度,但是当我运行代码时,rest属性返回未定义的。。。我的问题是,为什么它不表现为对同一个三元var rest的递归调用。我对javascript相当陌生,因此任何能帮助我理解为什么会发生这种情况的建议或文章都将非常有用。

正如评论员所说,您实际上并没有使这个函数递归——它从不调用自己

要实现您的目标,您必须做到以下几点:

function arrayToList(array){
  var list = {};
  var rest = ((array.length) ? (arrayToList(array.slice(1))) : null) ;
  list = {
    value: array[0],
    rest: rest
  }
  return list;
}

您可以使用
Array.prototype.reduce()

var list={};
var-arr=[1,2,3];
arr.reduce((o,prop,index,array)=>{
o[“值”]=道具;
o[“rest”]=index控制台日志(列表)在现代javascript中,您只需执行以下操作:

var arrayToList = array => array.slice().reverse().reduce((rest, value) => ({ value, rest }), { rest:null });
在通过传送机运行后,会变成

var arrayToList = function arrayToList(array) {
  return array.slice().reverse().reduce(function (rest, value) {
    return { value: value, rest: rest };
  }, { rest:null });
};
var数组=[1,2,3,4,5];
var arrayToList=函数(数组){
var list={};
var array=array.reverse();
var arrLength=array.length;
对于(var i=0;i
我还从那本书中学习了javascript,这本书让我很费劲。 我认为这更接近我们在书中所学到的东西


使用reduce函数也是解决这个问题的一个很好的方法,但这本书中还没有介绍,我们认为我们不知道如何使用它。

如果还提供了任务文本,这会很有帮助。“为什么它不表现为对同一个三元var rest的递归调用?”---因为它不是一个函数?@zerkms好的,所以为了让它自己调用它,它必须是一个函数。因此,不能在对象内部调用var rest并让它引用三元表达式?Terenary只是一个条件语句,期望它调用自己与期望if块调用自己是一样的。您可以尝试使用一个包含条件的内部while块,也可以使用一个实际的递归函数。Ok非常有意义,在这种情况下,实现while循环是否比实际的递归函数更合适,或者问这个问题有点傻@报废COLALAST
rest
值未设置为
null
良好点!我没有仔细阅读编辑过的问题,它是如何修复的,为什么使用
.reverse()
?OP expects
var list={value:1,rest:{value:2,rest:{value:3,rest:null}},否?不熟悉原型,但为了更好地理解,肯定会修改该主题。@CesarPerez不确定你的意思?这不是你需要熟悉的原型,它是reduce函数OK将查找它,我认为这个概念与将数组“折叠”或“展平”为一个值有关,但def将对其进行更深入的检查。
var array = [1,2,3,4,5];

var arrayToList = function(array) {
  var list = {};
  var array = array.reverse();
  var arrLength = array.length;
  for (var i = 0; i < arrLength; i++) {           
    var newList = function() {              
      if (i) {
        return list;
      } else {
        return null
      }                  
    }                 
     list = {
       value: array[i],
       list: newList()
     }                             
  }
  return list;
}

console.log(arrayToList(array));