我试图获取一个数组并从中创建一个嵌套对象,其中数组中的每个项目都是上一个项目的属性。
我认为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
相似:每个函数都有两个参数,一个迭代器函数和一个该函数的累加器的初始值。第二个参数是可选的,但在这里我将忽略它。
每个函数都对要调用它们的数组中的所有项进行迭代,并使用四个参数(即累加器,数组中的当前项,当前迭代计数和整个数组)为数组中的每个项调用迭代器函数。您称为
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
)是功能强大且灵活的工具,值得学习和使用。作为尾声,我将在每个步骤之后为您提供迭代器函数的返回值:
{ three: { staticCount: 1 } }
{ two: { three: { staticCount: 1 } }, staticCount: 1 }
{ one: { two: { three: { staticCount: 1 } }, staticCount: 1 }, staticCount: 1 }
关于javascript - 将未知长度的数组减少为嵌套对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53509668/