使用JavaScript将数组转换为列表

5
我正在阅读《JavaScript编程精解》,第四章末尾的挑战是将一个数组转换成列表,比如:

[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

从上面的代码可以看出,我不知道如何使用迭代创建“嵌套”的对象(列表)。请问有人能向我解释一下吗?


1
它不会将数组转换为列表,而是将数组转换为表示数组的对象。 - Nino Filiu
5个回答

4
你需要以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
哦,我明白了,所以你只需要将值声明为 value:,其余部分声明为 rest: - 你不需要在它们周围加引号,因为它们是对象属性,如果我理解正确的话。 - SpeakInCode43

3

我认为你已经得到了关于代码问题的很好的解答,但是以防万一你感兴趣,这是一个非常适用于 reduceRight() 的使用案例。

let a = [1, 3, 3]
let l = a.reduceRight((rest, val) => ({val, rest}), null)

console.log(l)

它的功能与你的代码基本相同——从null开始向后循环遍历列表,同时将前面的结果编译到rest属性中。


1
不错,保持这个方法一直存在是很好的。 - Shidersz

1
你可以大大简化你的代码。
有两种情况:数组为空,此时转换为null;数组不为空,只有第一个值有用,其余可以递归处理。这只需要一行代码。

const converter = arr => arr.length ? ({value: arr[0], rest: converter(arr.filter((_,i) => i>0))}) : null;      
console.log(converter(['a', 'b', 'c']));


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)


不对,应该用null进行初始化,而不是{} - Nino Filiu

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;}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接