@sayaka9876

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

任意の数のオブジェクト要素を含んだ配列を返す関数について

解決したいこと

プロジェクトの参考にしたコードで、構造が理解できない箇所があります。
以下のmakeData関数はオブジェクト要素を任意の数だけ含んだ配列を作成する関数なのですが、なぜこのコードで作成できるのか分かりません。

例えば、makeData(3)の場合、以下のオブジェクトが3つ入った配列を返します。

{firstname:, lastname:, subRow: undefined}

なぜ以下のような値にならないのでしょうか?

{firstname:, lastname:, subRow:{
    firstname:, lastname:, subRow:{
        firstname:, lastname:, subRow:{
 
}

どなたかご回答いただければ幸いです。

該当するソースコード

//名前をランダムに生成する
import namor from 'namor'

const range = len => {
  const arr = []
  for (let i = 0; i < len; i++) {
    arr.push(i)
  }
  return arr
}

const newPerson = () => {
  return {
    firstName: namor.generate({ words: 1, numbers: 0 }),
    lastName: namor.generate({ words: 1, numbers: 0 })
  }
}

//makeDataの引数で数字を受け取った場合、
//例えば3の場合、lensは[3]となり、lenは3、
//range(len)は[0,1,2]となる
export default function makeData(...lens) {
  const makeDataLevel = (depth = 0) => {
    const len = lens[depth]
    return range(len).map(d => {
      return {
        ...newPerson(),
       subRows: lens[depth + 1] ? makeDataLevel(depth + 1) : undefined,
      }
    })
  }

  return makeDataLevel()
}
0 likes

1Answer

makeDataのコメントに書かれている通りのことが起きているだけ。

makeData(3)と呼んだ場合、rangeメソッドにより、[0, 1, 2]が作成され、この配列に対してmapメソッドが適用されて、[{ newPersonの中身 }, { newPersonの中身 }, { newPersonの中身 }]に変換され返される。

おそらく、makeData(1, 1, 1)と呼べば、予想された形になる気がする。

1Like

Comments

  1. @sayaka9876

    Questioner

    なるほど!ちょっと理解出来そうです。
    このsubRowsの役割は何なんでしょうか?一見無くても問題なさそうですが…
  2. 例示されたものだと、家系図をイメージしたらいいんじゃないかな。

Your answer might help someone💌