雄辩的Javascript第4章:ArrayList/listToArray Execise
: 编写一个函数arrayToList,它可以构建一个数据结构,如 将[1,2,3]作为参数,并编写一个listToArray 从列表生成数组的函数。还要编写帮助程序 函数prepend,它接受一个元素和一个列表并创建一个新的 将元素添加到输入列表前面的列表,以及n, 它接受一个列表和一个数字,并返回给定位置的元素 列表中的位置,或在没有此类元素时未定义 有人能不用行话解释这个答案吗? 我只能根据指示学习 以下是我为arrayToList提出的建议: 所以启动列表null,创建循环递减,并在内部定义“i”,然后返回列表雄辩的Javascript第4章:ArrayList/listToArray Execise,javascript,arrays,Javascript,Arrays,: 编写一个函数arrayToList,它可以构建一个数据结构,如 将[1,2,3]作为参数,并编写一个listToArray 从列表生成数组的函数。还要编写帮助程序 函数prepend,它接受一个元素和一个列表并创建一个新的 将元素添加到输入列表前面的列表,以及n, 它接受一个列表和一个数字,并返回给定位置的元素 列表中的位置,或在没有此类元素时未定义 有人能不用行话解释这个答案吗? 我只能根据指示学习 以下是我为arrayToList提出的建议: 所以启动列表null,创建循环递减,并在内部
function arrayToList(array){ //pass list as parameter
var list = null; // don't know why we make it null
for (var i=array.length-1; i>=0; i--) // why -1 on the length?
list = {value: array[i], rest:list}; //clueless
return list;
}
什么是
rest:list
对象中的list
?我在回答他的问题,虽然很模糊
不知道为什么我们要把它设为空
可能只是为了说明初始化值是null
(与未定义的对应)。分配null
不是必须的
为什么长度为-1
因为长度是基于1的(包含4项的数组的长度为4),但对数组的索引是基于0的(数组[0]返回第一项)
无知的
此步骤是创建嵌套列表对象。第一个循环创建一个在该数组位置具有值的列表,第二个循环创建一个在该位置具有值和指向前一个列表的指针的包装器列表,依此类推
什么是rest:list
对象中的list
它在对象文本中创建一个属性rest
,并在将该对象分配给变量list
之前,将变量list
的值分配给它。请注意,这是在循环中发生的,因此它所做的是获取旧值并用引用旧值的新值覆盖它
这正是构建嵌套列表结构所需的
var list=null;//不知道为什么要将其设为空
这是初始值,将放在列表的“末尾”。如果数组为空,则返回该数组;如果数组有一个元素,则该数组将成为返回对象的rest
属性。如果数组有多个元素
为什么长度为-1
因为数组是零索引的,即它们的索引从0
到length-1
。当我们向后迭代时,我们需要这个奇数初始值和i>=0
比较。函数arrayToList(arr){
function arrayToList(arr) {
var obj = {};
for(var i = 0 ; i < arr.length; i++) {
if(i == arr.length) {
return obj.rest = null;
}
obj.value = arr.splice(0,1);
obj.rest = arrayToList(arr);
}
return obj;
};
console.clear();
console.dir(arrayToList([1,2,3,4,5]));
var obj={};
对于(变量i=0;i
需要修改@elount的最后一条评论:
var arr1 = [10, 20, 30];
function arrayToList(arr) {
var list = {};
for (var i = 0; i < arr.length; i++) {
list.value = arr.splice(0, 1)[0];
list.rest = (arr.length > 0) ? arrayToList(arr) : null;
}
return list;
}
console.clear();
console.log( arrayToList(arr1) );
var arr1=[10,20,30];
函数数组列表(arr){
var list={};
对于(变量i=0;i0)?arrayToList(arr):空;
}
退货清单;
}
console.clear();
console.log(arrayToList(arr1));
作为免责声明,我想说我自己也是一个新手,我在这里学习东西,也许可以通过这样做来帮助别人。下面是我如何理解第二个问题的答案
还可以编写一个listToArray函数,从列表中生成数组
以下代码将起作用:
function listToArray(list) {
let arr = [];
for(; list !== null; list = list.rest) {
arr.push(list.value);
}
return arr;
}
list参数将只保存要插入的参数。在我们的例子中是:{value:10,rest:{value:20,rest:null}
请记住,雄辩的Javascript中的代码将从一个包含3个元素的数组中创建一个列表[10、20、30]
,但在本例中,我们只使用由2个元素组成的列表
执行时,代码将执行以下操作:
第一次(第一次循环):
省略for循环的初始化(不要定义任何变量或
(做任何事)
检查列表是否不是空的-不是空的,因为此时
列表等于{value:10,rest:{value:20,rest:null}
使列表(函数的参数)等于list.rest
- 请记住,
.rest
只是对象列表的一个属性,它指向另一个对象——在本例中,它将指向{value:20,rest:null}
第二次(第二次循环):
省略for循环的初始化(不要定义任何变量或
(做任何事)
检查列表是否不是空的-不是空的,因为在
此时刻列表等于{value:20,rest:null}
再次使list等于list.rest-但此时它将
指向rest:null
,因此这次列表的值将是
rest
键的值,即null
第三次(第三次循环):
省略
检查列表是否不为空-在本例中为空,因此停止
执行并转到return语句
返回arr
我的答案基于:我的递归解决方案:
function arrayToList([...arr], n = 0){
return (n < arr.length) ? {value: arr[n], rest: arrayToList(arr, n + 1)} : null;
}
function listToArray({...list}, arr = []){
arr.push(list.value);
return (list.rest != null) ? listToArray(list.rest, arr) : arr;
}
console.log(arrayToList([10, 20]));
// → {value: 10, rest: {value: 20, rest: null}}
console.log(listToArray(arrayToList([10, 20, 30])));
// → [10, 20, 30]
函数数组列表([…arr],n=0){
返回(n
这是整件事的答案,上一章我完全搞糊涂了,我们正在学习基础知识,现在非常难啊,我明白了。我一眼就看错了。这是