我从头开始学习Javascript。没有捷径,没有框架,没有。只是简单的Javascript。只是为了它的乐趣,我正在做每一个运动。现在,当我谈到这个问题时:
编写一个函数arrayToList,用于构建像
这样的数据结构
var list = {
value: 1,
rest: {
value: 2,
rest: {
value: 3,
rest: null
}
}
};
我的代码必须能够满足以下要求:
console.log(arrayToList([10, 20]));
// → {value: 10, rest: {value: 20, rest: null}} <== expected output which I am sure you know
我试图递归地执行此操作,因为后面的问题要求我们递归地执行此操作(递归是我最薄弱的一点!)。但是,我得到了以下代码:
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;
};
然而,输出
{value: 20, rest: {value: 20, rest: {
value: 20
rest: {value: 20, rest: {value: 20, …}}
}}}
......指的是
的同一块{值:20,休息:{值:20,休息:{...}}
好吧,我没有扩展到最后看(它太长了!(开放后大约20次仍然是相同的)如果有一个结束的话。)
希望有人指导我找到答案。我已经花了几天时间在这上面而且卡住了。
非常感谢,祝大家过得愉快!
答案 0 :(得分:5)
您不需要全局list
变量,就像您目前正在使用一样(除非您尝试进行一些复杂的优化 - 暂时不用担心) 。事实上,看起来这个全局list
变量正是导致您出现问题的原因。我将尝试从一开始就指导您完成此操作。
首先,尝试确定输出的“重复”部分需要的样子。在您的情况下,重复的部分是:
{
value: someValue,
rest: RECURSION
}
因为如果您为上面的SAME结构交换RECURSION
,您将获得所需的确切级联效果:
{
value: someValue,
rest: {
value: someValue,
rest: RECURSION
}
}
等等。
一旦你确定了这一点,你的函数只需要返回该对象。就这么简单。交换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()
};
}
唯一要添加的是一个结束条件,所以如果没有剩下的值,递归就会返回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}}
就是这样!这有意义吗?
答案 1 :(得分:0)
您需要保留已添加的最后一项的列表,因为这将是您添加下一项的项目。
这样的事情:
var list = null;
function arrayToList(array) {
var last = null;
for (var i = 0; i < array.length; i++) {
var item = {
value: array[i],
rest: null
};
if (last == null)
list = item;
else
last.rest = item;
last = item;
}
return list;
}
console.log(arrayToList([10, 20]));