javascript - 将未知长度的数组缩减为嵌套对象

标签 javascript

我正在尝试获取一个数组并从中创建一个嵌套对象,其中数组中的每个项目都是前一个项目的属性。

我认为 reduce 是做到这一点的方法,但我发现 reduce 很难掌握,而且我尝试的每件事都让我不知如何进入下一个层次. JS: Reduce array to nested objects是一个类似的问题,但我尝试了很多变体后仍然无法解决。

const myArray = ['one', 'two', 'three'];

// Intended Output (note, the staticCount is always 1)
{
    one: {
        staticCount: 1,

        two: {
            staticCount: 1,

            three: {
                staticCount: 1
            }
        }
    }
}

最佳答案

有些作业需要Array.prototype.reduceRight:

const myArray = ['one', 'two', 'three']

const nestNode = (acc, key) => {
  acc.staticCount = 1
  return { [key]: acc }
}
console.log(myArray.reduceRight(nestNode, {}))

让我们看一下 reduceRight(并且通过扩展,reduce):

我将迭代器函数定义移出了对 reduceRight 的调用,以使该示例更易于讨论(参见 nestNode)。

reducereduceRight 类似:

  1. 每个都有两个参数,一个迭代器函数和该函数的累加器的初始值。第二个参数是可选的,但我会在这里忽略它。

  2. Each 遍历调用它们的数组中的所有项,使用四个参数为数组中的每个项调用迭代器函数,累加器,数组中的当前项,当前迭代count 和你调用 reduce 的整个数组。最后两个参数在这里不相关(我很少使用它们)。

  3. 第一次调用迭代器函数时,它将传递您提供给 reducereduceRight 的第二个参数(初始累加器值)。之后,它将传递上一步中迭代器函数返回的任何内容。

因为我认为 reduce(以及扩展 reduceRight)是值得理解的强大抽象,所以我将逐步完成代码中的前两个步骤示例:

  1. 在迭代的第一步,我们的迭代器函数是这样调用的:nestNode(acc = {}, key = 'three')。在 nestNode 中,我们将 staticCount 属性添加到 acc 并将其设置为 1,从而为我们提供 acc = { staticCount: 1 } 。然后我们创建并返回一个新对象,其属性名为 'three',其值等于 acc。第一步nestNode返回的值为{ three: { staticCount: 1 } } nestNode会在中调用这个值第二步。

  2. 在迭代的第二步,我们的迭代器函数是这样调用的:nestNode(acc = { three: { staticCount: 1 } }, key = 'two')。同样,我们将 staticCount 属性添加到 acc 并将其设置为 1,从而得到 acc = { three: { staticCount: 1 }, staticCount: 1 .然后,我们创建并返回一个新对象,该对象具有名为 'two' 的属性,其值等于 acc。我们返回的值是 { two: { three: { staticCount: 1 }, staticCount: 1 } } 。同样,该值将在下一步中使用。

我将跳过最后一步,因为我希望详细了解前两个步骤足以让事情变得更清楚一些。如果您还有其他问题,或者仍然发现不清楚或令人困惑的地方,请告诉我。

reduce(和 reduceRight)是功能强大、灵活的工具,值得学习和熟悉。

作为尾声,我将在每一步之后将迭代器函数的返回值留给您:

  1. { 三:{ staticCount: 1 } }

  2. { 二:{ 三: { staticCount: 1 } }, staticCount: 1 }

  3. { 一:{ 二: { 三: { staticCount: 1 } }, staticCount: 1 }, staticCount: 1 }

关于javascript - 将未知长度的数组缩减为嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53509668/

相关文章:

javascript - $http 的 Angular IE 缓存问题

javascript - 在 jQuery 列表中添加滚动动画

javascript - 当 aot 设置为 true 时,ngClass 和 ngIf 条件无法编译

javascript - node.js 依赖列表中的 "^"是什么意思?

javascript - 来自对象和对象的名称数组

javascript - 使用类型化的 javascript/jquery 库使光标与文本大小相同

javascript - 保留选定的图像而不是用新图像替换

javascript - 使用 javascript 进行多重下载

javascript - 使用全屏闪光灯控件检测 window.onfocus?

javascript - 在 react 中保持状态和滚动位置