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

在Javascript中从数组创建列表对象,javascript,recursion,Javascript,Recursion,我从一开始就在学习Javascript。没有捷径,没有框架,什么都没有。只是简单的Javascript。为了好玩,我做了每一项运动。现在,当我谈到这个问题时: 编写一个函数arrayToList,它构建一个数据结构,如 我的代码必须能够满足以下要求: console.log(arrayToList([10, 20])); // → {value: 10, rest: {value: 20, rest: null}} <== expected output which I am sure

我从一开始就在学习Javascript。没有捷径,没有框架,什么都没有。只是简单的Javascript。为了好玩,我做了每一项运动。现在,当我谈到这个问题时:

编写一个函数arrayToList,它构建一个数据结构,如

我的代码必须能够满足以下要求:

console.log(arrayToList([10, 20])); 
// → {value: 10, rest: {value: 20, rest: null}} <== expected output which I am sure you know
然而,输出

{value: 20, rest: {value: 20, rest: {
                                      value:    20
                                      rest: {value: 20, rest: {value: 20, …}}
}}} 
这个。。。指的是相同的数据块

{value:20,rest:{value:20,rest:{…}

好吧,我没有扩展到结尾去看(太长了!(大约20次打开后仍然是一样的)是否有结尾

希望有人能帮我找到答案。我已经花了几天时间在这个问题上了,我被卡住了


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

您需要保留您添加的最后一个项目的列表,因为这将是您添加下一个项目的项目

大概是这样的:

var list=null;
函数数组列表(数组){
var last=null;
对于(var i=0;i
指南(希望如此!) 您不需要全局
列表
变量,就像您当前正在使用的那样(除非您正在尝试进行一些复杂的优化–暂时不用担心)。事实上,这个全局
列表
变量似乎是导致您出现问题的原因。我将尝试从一开始就引导您了解正确的方法

首先,尝试确定输出的“重复”部分需要是什么样子。在您的情况下,重复部分是:

{
    value: someValue,
    rest: RECURSION
}
因为如果您为上述相同的结构交换
递归
,您将获得所需的确切级联效果:

{
    value: someValue,
    rest: {
        value: someValue,
        rest: RECURSION
    }
}
等等

一旦您确定了该值,您的函数实际上只需要返回该对象。就是这么简单。。将
someValue
交换为前面的值(即
arr.shift()
的返回值),并将
递归
交换为对函数的调用,将其传递给数组的其余部分。这将给出:

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

    return {
        value: value,
        rest: arrayToList(arr) // arr has already had its front value removed, by .shift()
    };
}
唯一需要添加的是结束条件,因此如果没有更多的值,递归只返回
null
(否则我们将永远循环):

全解
函数数组列表(arr){
如果(arr.length==0){
返回null;
}
var值=arr.shift();
返回{
价值:价值,
其余:阵列列表(arr)
};
}

log(arraytolost([10,20]);//{value:10,rest:{value:20,rest:null}
谢谢你的回答,但我需要它,就像在递归中一样。但是谢谢:)是的。非常简单明了的代码,非常容易理解。非常感谢@Shai!我可以知道我在哪里学习递归吗?我在这方面很弱。没问题。例如,你用谷歌搜索过
javascript递归
?。是的,我做过。我知道我读过使用书籍。但我始终无法理解核心概念,因为我仍然无法很好地掌握它来使用它。可能是害怕。我会再试一次。谢谢,我:)
{
    value: someValue,
    rest: {
        value: someValue,
        rest: RECURSION
    }
}
function arrayToList(arr) {
    var value = arr.shift();

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