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

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

新規登録して質問してみよう
ただいま回答率
85.35%
オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1291閲覧

TypeScriptでオブジェクト配列を作成する方法

teis

総合スコア10

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2020/08/02 07:18

編集2020/08/02 10:51

実現したいこと

任意のオブジェクトが20個入った配列を作りたいのですが、どう書けば良いのかわかりません。
オブジェクト配列自体は作成できても、fillを使用するとそのオブジェクトへの参照がコピーされてしまうため、配列内の一つのオブジェクトを書き換えると他のオブジェクトも全て書き換わってしまいます。
オブジェクトが書き換わらないオブジェクト配列の作成方法を教えていただきたいです。

試したこと

TypeScript

1// { node: [], edge: [] }オブジェクトが20個入った配列を作りたい 2type Data = { 3 node: [] 4 edge: [] 5} 6 7// 試したこと① 8const initData_a = Array<Data>(20).fill({ node: [], edge: [] }) // オブジェクトへの参照がコピーされる 9initData_a[0].node.push({ id: '0', label: 'something' }) 10 11// 試したこと② 12const initData_b = Array<Data>(20).fill().map(() => ({ node: [], edge: [] })) // オブジェクトへの参照がコピーされる 13initData_b[0].node.push({ id: '0', label: 'something' }) 14 15// 結果:一つ目のオブジェクト以外も書き換わる 16// initData_a,initData_b = [ 17// { node: [{ id: '0', label: 'something' }], edge: [] }, 18// { node: [{ id: '0', label: 'something' }], edge: [] }, 19// ...]

補足

Array.fillの仕様

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

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

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

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

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

miyabi_takatsuk

2020/08/02 09:20 編集

> そのオブジェクトへの参照がコピーされてしまうため それをやっている構文を記載してください。 そこに答えがあるかと。 また、本件は、TypeScriptのみの話なので、 質問タイトルを直すのと、 質問タグはJavaScriptはとるべきかと。
teis

2020/08/02 10:53

コメントありがとうございます。 > それをやっている構文を記載してください。 fill関数使用時のことを示しています。 補足を追記し、タグとタイトルを修正しました。
guest

回答1

0

ベストアンサー

原始的なやり方がいちばん確実です。

typescript

1const initData: Data[] = []; 2 3for(let i = 0; i < 20; ++i) initData[i] = { node: [], edge: [] };

投稿2020/08/04 07:22

編集2020/08/04 07:45
maisumakun

総合スコア146018

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

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

maisumakun

2020/08/04 07:23

なお、constは「initDataを別なオブジェクトに付け替えられない」という意味で、initDataの配列を破壊的に変更する分には無関係です。
teis

2020/08/05 12:09

ありがとうございます。 原始的な方法を避けて書いてきたのですが、その方法が確実と聞いてすっきりしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問