我正在阅读Eloquent JavaScript,在第4章的最后,它挑战您将数组转换为列表,即
[1, 3, 3] --> {value: 1, rest: {value: 2, rest: {value: 3, rest: null}}};
我认为我不了解这个概念。
它建议向后遍历数组,所以我尝试了:
function arrayToList(array) {
let list = {};
for (let i = array.length -1; i > array[0]; i--) {
list += ("value:" + i + ", rest: null");
}
return list;
}
console.log(arrayToList([1, 2, 3]));
这将注销:
[object Object]value:2, rest: null
如您所见,我不了解如何通过迭代创建“嵌套”对象(列表)。有人可以向我解释一下吗?
答案 0 :(得分:3)
您需要以null
作为第一个list
值。
然后,您需要遍历索引从最后到零的元素,并为新的list
对象分配一个数组中的实际值,而前一个列表为rest
。
您尝试的是通过检查元素并以错误的值开头的错误迭代,该错误值随后通过添加字符串而不是对象而转换为字符串。
function arrayToList(array) {
let list = null;
for (let i = array.length - 1; i >= 0; i--) {
list = { value: array[i], rest: list };
}
return list;
}
console.log(arrayToList([1, 2, 3]));
答案 1 :(得分:3)
我认为您对代码中的问题有一个很好的答案,但是如果您有兴趣,这是reduceRight()
let a = [1, 3, 3]
let l = a.reduceRight((rest, val) => ({val, rest}), null)
console.log(l)
它执行的功能与您的代码大致相同-以null
开头,并在列表中向后循环,同时将先前的结果编译为rest
属性。
答案 2 :(得分:1)
您可以极大地简化您的代码。
有两种情况:或者数组为空,在这种情况下强制转换为null
,或者不是,在这种情况下,仅第一个值很重要,其余的可以在数组的其余部分上递归处理。这是一个班轮。
const converter = arr => arr.length ? ({value: arr[0], rest: converter(arr.filter((_,i) => i>0))}) : null;
console.log(converter(['a', 'b', 'c']));
答案 3 :(得分:1)
使用正向迭代,您可以执行以下操作。遍历数组,在每次迭代时都定义嵌套对象,直到到达最后一个元素,并且到达最后一个定义属性为null
。
let data = [1, 3, 3];
let res = {};
for (let i = 0, obj = res; i < data.length; i++) {
obj.value = data[i];
obj = obj.rest = i < data.length - 1 ? {} : null;
}
console.log(res)
答案 4 :(得分:1)
这可能是非常适合递归方法的问题:
function arrayToList(array)
{
if (array.length <= 0)
return null;
return {value: array[0], rest: arrayToList(array.slice(1))};
}
console.log(arrayToList([1, 2, 3]));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}