使用JavaScript将数组变成列表

时间:2019-04-19 18:57:43

标签: javascript arrays flatten

我正在阅读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

如您所见,我不了解如何通过迭代创建“嵌套”对象(列表)。有人可以向我解释一下吗?

5 个答案:

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