2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Array.prototype.fill()にオブジェクトをそのまま渡してハマった

Last updated at Posted at 2019-10-28

知らなくてハマったのでこれから知らなくてハマる人のために書きます。

顛末

最初は単純な二次元配列でやっていたところを状態持たせようとオブジェクトに変更してハマりました。お馬鹿さんですね。

maze-text-generator | m19e

const fillArray = arr => {
  // before
  // fillにそのままオブジェクトを渡してはダメです
  return arr.map(x => new Array(x.length).fill({char: '', blacklist: []}))
}

const maze = fillArray(generateEmptyArray([5,10]))
/*
ほほほほほ
ほほほほほ
ほほほほほ
ほほほほほ
ほほほほほ
ほほほほほ
ほほほほほ
ほほほほほ
ほほほほほ
ほほほほほ

charだけ抜き出すとこう
*/

maze[0][0]['char'] = ''

/*
黒黒黒黒黒
ほほほほほ
ーー略ーー
ほほほほほ
ほほほほほ

え?
*/

わけがわからない。

解決

const fillArray = arr => {
  // after
  // fillしたあとにmapで埋めてあげるといい感じ
  return arr.map(x => new Array(x.length).fill().map( x => { return {char: '', blacklist: []} }))
}

const maze = fillArray(generateEmptyArray([5,10]))

maze[0][0]['char'] = ''

/*
黒ほほほほ
ほほほほほ
ーー略ーー
ほほほほほ
ほほほほほ

ヨシ!
*/

解決したのでテキストを埋め込む再帰関数に投げます。


fillGrid(maze, [...'黒猫列車はお客様第一'])

/*
黒ほほほほ
猫ほほほほ
列ほほほほ
車客様ほほ
はお第一ほ
ほほほほほ
ほほほほほ
ほほほほほ
ほほほほほ
ほほほほほ

にゃあん!
*/

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

補遺

よく考えたらArray.prototype.fill()自体使わなくていいのでは?

const generateFilledArray = (x, y) => {
  return [...Array(y)].map(_=>[...Array(x)].map(_=>({char: '', blacklist: []})))
}

fillGrid(generateFilledArray(10,10), [...'銀河を繋ぐ黒猫列車、本日ひとりめのお客様がご乗車ですっ'])

/*
銀河ぐ黒猫列車ほほほ
ほを繋ほ日本、ほほほ
ほほほほひとりめのほ
ほほほほ車乗ほ客おほ
ほほほほでごが様ほほ
ほほほっすほほほほほ
ほほほほほほほほほほ
ほほほほほほほほほほ
ほほほほほほほほほほ
ほほほほほほほほほほ

いいでしょう!
*/

参考

Array.prototype.fill() with object passes reference and not new instance - Stack Overflow
[エンジニアのハマり時間とその技術的難易度の相関関係] (https://qiita.com/jabba/items/b0a0f8c310e164b4db2b)

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?