【ゆめみからの挑戦状★第3弾】を解説しながら解く!

当サイトではアフィリエイト広告を利用して商品を紹介しています。

コードを書くのに疲れたのでコードを書きます。

【ゆめみからの挑戦状★第3弾】

function yumemiCode() {
  const array1 = [1, 2, 3, 4, 5, 6]
  const array2 = array1
  console.log(array2)
  // -> [ 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6 ]
}

考えたこと

このままではなにもわからないので、出力される配列を分解してみます。

 * 1 -> [1,1,1]
 * 2 -> [2,2]
 * 3 -> [3,3,3]
 * 4 -> [4,4]
 * 5 -> [5,5,5]
 * 6 -> [6,6]

こうしてみると、偶数なら2つ、奇数なら3つになっていることがわかります。

mapメソッドを使って配列偶数と奇数を判定処理する。

配列を順番に処理するなら反復メソッドということで一度mapメソッドを使って偶数と奇数を判定する処理を書いてみることにします。

function yumemiCode01() {
  const array1 = [1, 2, 3, 4, 5, 6]
  const array2 = array1.map(value => {
    if (value % 2 === 0) {
      return `${value}は偶数`
    } else {
      return `${value}は奇数`
    }
  })
  console.log(array2)
  // -> [ '1は奇数', '2は偶数', '3は奇数', '4は偶数', '5は奇数', '6は偶数' ]
}

奇数ならvalue を3つにコピー、偶数なら2つにコピーする処理を書いてみる。

偶数と奇数の判定はできたので次に、それに応じて、値をコピーして増やす処理を書きます。

function yumemiCode02() {
  const array1 = [1, 2, 3, 4, 5, 6]
  const array2 = array1.map(value => {
    if (value % 2 === 0) {
      const result = new Array(2).fill(value)
      return result
    } else {
      const result = new Array(3).fill(value)
      return result
    }
  })
  console.log(array2)
  // -> 	
  // [ [ 1, 1, 1 ],
  // [ 2, 2 ],
  // [ 3, 3, 3 ],
  // [ 4, 4 ],
  // [ 5, 5, 5 ],
  // [ 6, 6 ] ]
}

【完成?】次元を減らせば、良さそうなので、flatメソッドを使って次元を減らす

いい感じに書けました。次元を減らす.flatメソッドを使えば良さそうです。

function yumemiCode03() {
  const array1 = [1, 2, 3, 4, 5, 6]
  const array2 = array1.map(value => {
    if (value % 2 === 0) {
      const result = new Array(2).fill(value)
      return result
    } else {
      const result = new Array(3).fill(value)
      return result
    }
  }).flat()
  console.log(array2)
  //-> [ 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6 ]
}

【完成!!】リファクタリングをする

しかしこのままでは読みにくいのでリファクタリングをして、いきます。

1、flatmapというメソッドがあるので、mapをflatMapに変更
2、三項演算子で書き換え

function yumemiCode04() {
  const array1 = [1, 2, 3, 4, 5, 6]
  const array2 = array1.flatMap(value => {
    const result = (value % 2 === 0) ? new Array(2).fill(value) : new Array(3).fill(value)
    return result
  })
  console.log(array2)
  //-> [ 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6 ]
}

感想

というわけで、頭の体操とおもいつつ問題を解いてみました。
解けてよかった!

ほかにも回答は無数にありそうなので、引用リツイートをみて勉強しようと思います。

ありがとうございました!

プログラミング

Posted by sochan