我正在尝试获取一个数组并从中创建一个嵌套对象,其中数组中的每个项目都是前一个项目的属性。
我认为 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
)。
reduce
和reduceRight
类似:
每个都有两个参数,一个迭代器函数和该函数的累加器的初始值。第二个参数是可选的,但我会在这里忽略它。
Each 遍历调用它们的数组中的所有项,使用四个参数为数组中的每个项调用迭代器函数,累加器,数组中的当前项,当前迭代count 和你调用
reduce
的整个数组。最后两个参数在这里不相关(我很少使用它们)。第一次调用迭代器函数时,它将传递您提供给
reduce
或reduceRight
的第二个参数(初始累加器值)。之后,它将传递上一步中迭代器函数返回的任何内容。
因为我认为 reduce
(以及扩展 reduceRight
)是值得理解的强大抽象,所以我将逐步完成代码中的前两个步骤示例:
在迭代的第一步,我们的迭代器函数是这样调用的:
nestNode(acc = {}, key = 'three')
。在nestNode
中,我们将staticCount
属性添加到acc
并将其设置为1
,从而为我们提供acc = { staticCount: 1 }
。然后我们创建并返回一个新对象,其属性名为'three'
,其值等于acc
。第一步nestNode
返回的值为{ three: { staticCount: 1 } }
,nestNode
会在中调用这个值第二步。在迭代的第二步,我们的迭代器函数是这样调用的:
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
)是功能强大、灵活的工具,值得学习和熟悉。
作为尾声,我将在每一步之后将迭代器函数的返回值留给您:
{ 三:{ staticCount: 1 } }
{ 二:{ 三: { staticCount: 1 } }, staticCount: 1 }
{ 一:{ 二: { 三: { staticCount: 1 } }, staticCount: 1 }, staticCount: 1 }
关于javascript - 将未知长度的数组缩减为嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53509668/