【问题标题】:Turn Array Into List With JavaScript [duplicate]使用 JavaScript 将数组转换为列表 [重复]
【发布时间】:2019-09-10 00:02:57
【问题描述】:

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

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

【问题讨论】:

  • 它不会把一个数组变成一个列表,而是把一个数组变成一个表示数组的对象

标签: javascript arrays flatten


【解决方案1】:

您需要以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]));

【讨论】:

  • 哦,我明白了,所以你可以将值声明为value:,其余的声明为rest: - 你不需要在它们周围加上引号,因为它们是对象属性,如果我理解正确。
【解决方案2】:

您可以大大简化您的代码。

有两种情况:要么数组为空,在这种情况下转换为null,要么不是,在这种情况下只有第一个值很重要,其余的可以在数组的其余部分上递归处理。这是一个单线。

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

【讨论】:

    【解决方案3】:

    通过前向迭代,您可以执行以下操作。遍历数组,在每次迭代中定义嵌套对象,直到到达最后一个元素,当到达最后一个元素时,将属性定义为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初始化,而不是{}
    【解决方案4】:

    这可能是一个非常适合递归方法的问题:

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

    【讨论】:

      【解决方案5】:

      我认为你对为什么你的代码有问题有很好的答案,但如果你有兴趣,这是reduceRight() 的一个非常漂亮的用例

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

      它或多或少与您的代码执行相同的操作 — 从 null 开始并在列表中向后循环,同时将先前的结果编译到 rest 属性中。

      【讨论】:

      • 很好,很高兴保持该方法始终存在。
      猜你喜欢
      • 1970-01-01
      • 2019-04-10
      • 2019-01-21
      • 2014-07-14
      • 2012-04-01
      • 2016-04-15
      • 1970-01-01
      • 2016-12-13
      • 2022-07-07
      相关资源
      最近更新 更多