在Javascript中从数组创建列表对象
我从一开始就在学习Javascript。没有捷径,没有框架,什么都没有。只是简单的Javascript。为了好玩,我做了每一项运动。现在,当我谈到这个问题时: 编写一个函数arrayToList,它构建一个数据结构,如 我的代码必须能够满足以下要求:在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
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()
};
}