在Javascript中从数组创建列表对象

Kio*_*ong 1 javascript recursion

我从一开始就经历了Javascript.没有捷径,没有框架,没有.只是简单的Javascript.只是为了它的乐趣,我正在做每一个运动.现在,当我谈到这个问题:

编写一个函数arrayToList来构建一个类似的数据结构

var list = {
  value: 1,
  rest: {
    value: 2,
    rest: {
      value: 3,
      rest: null
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

我的代码必须能够满足以下条件:

console.log(arrayToList([10, 20])); 
// ? {value: 10, rest: {value: 20, rest: null}} <== expected output which I am sure you know
Run Code Online (Sandbox Code Playgroud)

我试图递归地执行此操作,因为后面的问题要求我们递归地执行此操作(递归是我最薄弱的一点!).但是,我得到了以下代码:

var list = 
    {
      value: 0,
      rest: null
    }

function arrayToList(array)
{   
  list.value = array.shift();

    if(array.length!=0)
    {
      list.rest = arrayToList(array);
    }
  else
  {
    list.rest = null;
    console.log(list); //this outputs to {value: 20, rest: null}
    return list;
  } 
  return list;
};
Run Code Online (Sandbox Code Playgroud)

但是,输出

{value: 20, rest: {value: 20, rest: {
                                      value:    20
                                      rest: {value: 20, rest: {value: 20, …}}
}}} 
Run Code Online (Sandbox Code Playgroud)

......指的是同一块

{值:20,休息:{值:20,休息:{...}}

好吧,我没有扩展到最后看(它太长了!(开放后大约20次仍然是相同的)如果有一个结束的话).

希望有人指导我的答案.我已经花了几天时间在这上面并且卡住了.

非常感谢,祝大家度过愉快的一天!

Sha*_*hai 5

指导(希望!)

您不需要list像目前正在使用的全局变量(除非您尝试进行一些复杂的优化 - 现在不要担心它).实际上,看起来这个全局list变量正是导致问题的原因.我将尝试从一开始就引导您完成正确的方法.

首先,尝试确定输出的"重复"部分需要的样子.在您的情况下,重复的部分是:

{
    value: someValue,
    rest: RECURSION
}
Run Code Online (Sandbox Code Playgroud)

因为如果您交换RECURSION上面的SAME结构,您将获得所需的确切级联效果:

{
    value: someValue,
    rest: {
        value: someValue,
        rest: RECURSION
    }
}
Run Code Online (Sandbox Code Playgroud)

等等.

一旦确定了这一点,您的函数就需要返回该对象.就这么简单.交换someValue该前端值(即返回值arr.shift()),并将RECURSION调用交换回函数,并将其传递给数组的其余部分.这使:

function arrayToList(arr) {
    var value = arr.shift();

    return {
        value: value,
        rest: arrayToList(arr) // arr has already had its front value removed, by .shift()
    };
}
Run Code Online (Sandbox Code Playgroud)

剩下要添加的唯一内容是结束条件,因此如果没有剩余值,则递归仅返回null(否则我们将永远循环):

完整解决方案

function arrayToList(arr) {
    if (arr.length === 0) {
        return null;
    }
  
    var value = arr.shift();

    return {
        value: value,
        rest: arrayToList(arr)
    };
}

console.log(arrayToList([10, 20])); // {value: 10, rest: {value: 20, rest: null}}
Run Code Online (Sandbox Code Playgroud)

而已!那有意义吗?