質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

919閲覧

中身が空の二次元配列を生成する方法

Cocode

総合スコア2314

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/09/26 00:52

知りたいこと

  • 中身が空の2次元配列を生成する方法
    • 1次元目の配列の長さは指定
    • 2次元目は空の配列
    • 期待する出力結果の例)[[], [], []]
  • circular object Array とは何か?
    • (これについては、できれば知りたいという感じなので、無回答でも大丈夫です)

試したこと

以下のコードを考えました。この中のどれか、または他に効率的な書き方がないか知りたいです。

javascript

1// この方法は、要素数が多い時大変なのでダメ 2let arr1 = [[], [], []]; 3console.log(arr1) 4 5// コードの見た目はきれいだけど、2つめ以降が circular object Array になる 6let arr2 = Array(3).fill([]); 7console.log(arr2); 8 9// 出力結果は理想通りですが、冗長的な記法に感じる 10let arr3 = [...Array(3)].map(() => Array()); 11let arr4 = Array.from({length: 3}, () => []); 12console.log(arr3); 13console.log(arr4); 14

arr2の方法だと出力結果が[[], [circular object Array], [circular object Array]]となります。
circular object Array とは何でしょうか?
検索をかけてみたのですが、海外のサイトばかりヒットしてよく分かりませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

let arr2 = Array(3).fill([]);

fillにオブジェクトを指定するとすべて同じオブジェクトが参照されるのでNG

let arr3 = [...Array(3)].map(() => Array());

上記がベターでしょう

javascript

1const a = Array(3).fill(null).map(()=>[]);

文字列から

別回です

javascript

1const a = JSON.parse(`[${',[]'.repeat(3).substr(1)}]`); 2console.dir(a);

投稿2022/09/26 01:00

編集2022/09/26 02:25
yambejp

総合スコア114784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Cocode

2022/09/26 01:06

circular object Arrayに関わる回答ありがとうございます!!「すべて同じオブジェクトが参照される」とはつまり、2次元目の [ ] のうちどれか一つを変更したら、連動して他の全部も同じ内容になるということですか?
yambejp

2022/09/26 01:11

> どれか一つを変更したら、連動して他の全部も同じ内容になる そうですよ。 const a = Array(3).fill([]); a[0].push(1); console.dir(a);
Cocode

2022/09/26 01:15 編集

いただいたコードを試してみました。全部 1 になっていました。NGだと知られてよかったです。ご回答ありがとうございました!
yambejp

2022/09/26 02:26

jsonの文字列から起こすという考え方もありますね 追記しておきました
Cocode

2022/09/29 17:41

所見としては、 ■小さい配列の場合 let arr3 = [...Array(3)].map(() => Array()); げよくて、 ■大きい配列の場合 Think49さんの回答がよさそうと感じました。 function sample (i) { const array = []; while (i--) array.push([]); return array; } みなさんありがとおうございましたー!
guest

0

以下のコードを考えました。この中のどれか、または他に効率的な書き方がないか知りたいです。

mapやfillは配列を作り直しているので効率が良くありません。
配列初期化時にまとめて要素を生成するコードが最も効率が良いと思います。

'use strict'; function sample (i) { const array = []; while (i--) array.push([]); return array; } console.log(sample(3)); // [[], [], []]

Re: Cocode さん

投稿2022/09/26 02:02

編集2022/09/26 02:07
think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Cocode

2022/09/26 02:19

回答ありがとうございます。確かに、処理の観点からいうと一番軽そうです…!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問