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

我认为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相似:


每个函数都有两个参数,一个迭代器函数和一个该函数的累加器的初始值。第二个参数是可选的,但在这里我将忽略它。
每个函数都对要调用它们的数组中的所有项进行迭代,并使用四个参数(即累加器,数组中的当前项,当前迭代计数和整个数组)为数组中的每个项调用迭代器函数。您称为reduce。最后两个参数在这里无关紧要(我很少使用它们)。
首次调用迭代器函数时,它将传递给您提供给reducereduceRight(初始累加器值)的第二个参数。然后,它将传递上一步中迭代器函数返回的内容。


因为我认为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/

10-12 14:22