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

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

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

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

Q&A

解決済

4回答

1263閲覧

連想配列とオブジェクトの違いについて

aae_11

総合スコア178

JavaScript

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

2グッド

1クリップ

投稿2019/08/21 00:57

編集2019/08/21 01:03

以下のコードについて、お聞きしたいのですが、以下のquizSetは、配列の中に、オブジェクトが格納されている、多次元のオブジェクト連想配列であるとの認識で正しいでしょうか?
配列について、調べていたのですが、オブジェクトと連想配列とが若干混乱してしまった為、ご質問させて貰いました。
ご助言頂けましたら、幸いです。

const quizSet = [ {q: 'What is A?', c:['A0','A1','A2']}, {q: 'What is B?', c:['B0','B1','B2']}, {q: 'What is C?', c:['C0','C1','C2']}, ];
toll_tree, newyee👍を押しています

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

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

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

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

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

m.ts10806

2019/08/21 01:03

Google検索が使えない事情でもなければ調べてから質問してください。 調べたほうがどう見ても早い内容を丸投げ質問しすぎです。 調べたならそれを書かないと誰にも伝わりません。
guest

回答4

0

JavaScriptにある{}オブジェクトでそもそも「連想配列」という概念にはあたりません。
オブジェクトが「他の言語で言う連想配列のように使える」だけです。

  • [オブジェクト初期化子

](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Object_initializer)
「構文」のところを参照

もっと言えば「配列」もオブジェクトです。

Array

JavaScript の Array オブジェクトは、配列を構築するためのグローバルオブジェクトで、配列とは複数の要素の集合を格納管理するリスト構造です。

初期化は確かにこのように書かれることが多いです。

js

1let obj = {}; 2let arr = [];

ただこれはあくまでリテラルであり、丁寧に書くとこうなります。

js

1let obj = new Object(); 2let arr = new Array();

様々なオブジェクト指向言語で出てくるnewですね。
newはご存知かもしれませんが、オブジェクトをインスタンス化する演算子です。

オブジェクトなので、いわゆる連想配列の特徴である「添え字」とは呼びません。
プロパティです。
(いうなれば属性名と属性値のペアの集まりです)

js

1let obj = {}; 2obj.hoge = "a";//プロパティ

ただ、リテラルとしても記述が可能であるため、連想配列”のような”アクセスの仕方が可能となっているだけです。

js

1let obj = {}; 2obj.hoge = "a"; 3console.log(obj); //{ hoge: 'a' } 4console.log(obj.hoge); //a 5console.log(obj["hoge"]); //a

オブジェクトなので、メソッドも持てます。

js

1let obj = {}; 2obj.fnc = function(a){ 3 console.log(a); //b 4} 5obj.fnc("b");

ちなみに{}のところを[]にして確認してみても結果としては”ほぼ”同じです。
ObjectかArrayかの違いだけですね。

js

1let arr = []; 2arr.hoge = "a"; 3console.log(arr); //[ hoge: 'a' ] 4console.log(arr.hoge); //a 5console.log(arr["hoge"]); //a 6arr.fnc = function(a){ 7 console.log(a); //b 8} 9arr.fnc("b");

私自身もObjectとArrayの完全な使い分けができるほど使い込んでいるわけではありません。
どこかで拾ってきたような言葉を借りるようになりますが、私もおおよそ下記のように考えています

  • 数値だけが順番にならんでいるようなデータならArrayが適切
  • データをまとめて扱うならObjectが適切
  • 表のように複数のレコードを扱うならArray+Object

蛇足:
ちなみに今回色々試していく中で「あ、こんなこともできたのか」と知ったことがあるのでついでに書いておきます。

PHP

1<?php 2$arr = []; 3$arr[] = function($a){ 4 echo $a; 5}; 6$arr[] = "v"; 7var_dump($arr); 8 9$arr[0]("b");

もはや「配列」って便宜上そう呼んでいるだけで
そもそもオブジェクトって「モノ」そのものなので
プログラミング言語上は正しくは「全てオブジェクト」ということなのかなと思いました
(あくまで今回検証した範囲で。私自身も知らない言語の方が多いので言語毎に概念や表現をドキュメントで確認する必要はあります)。

C言語もちゃんと勉強しようかなと思った今日この頃です。

投稿2019/08/21 01:02

編集2019/08/22 01:11
m.ts10806

総合スコア80850

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

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

maisumakun

2019/08/21 01:06

最近はMapという、本格的に連想配列として使えるクラスも登場しています(ただ、「リテラルで書けない」「JSONとの相性が悪い」などの使い勝手の悪い場所があるのも間違いないところです)。
m.ts10806

2019/08/21 01:10

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map のことですね。 見た感じArrayの配下にあるのであくまで「配列」なのかなという印象でした。 確かに仰るように使い勝手は悪そうです。 今回はあくまで{} について聞かれているので「それは概念としてはオブジェクトで”他の言語で言う連想配列”のように使えるものだよ」という風に伝えたかったものです。ちょっと本文変更しました。
m.ts10806

2019/08/21 01:14

ありがとうございます。確認しました。 JavaのHashMapに近い感じはしますね。
m.ts10806

2019/08/21 01:16

色々とご指摘受けたこともありますし(私が扱ったことがなかった部分なので知れて良かったです) 冒頭書き出しは間違いと認識できました。更新しています。
m.ts10806

2019/08/21 01:22 編集

ただ気になるのは「連想配列」という表現が使われていないことですね。 原文「key-value pairs」という表現で済ませてしまっているようには思います。 PHPは明確に「連想配列」という表現があるので、 https://www.php.net/manual/ja/language.types.array.php そのあたりの経緯は知りたいところです。 JavaScriptで”連想配列”と言っていいものかどうか。あくまで「連想配列のように使えるものである」というべきか。
Zuishin

2019/08/21 01:33 編集

連想配列、辞書、ハッシュ、マップは同じ意味で使われていることが多いですね。「ハッシュ」は実装に踏み込んでいるので一つ異質な感じはしますが。 私の感覚では、JavaScript で連想配列に当たるものはオブジェクトと Map の二種類で、連想配列としての使い勝手が悪かったオブジェクトの欠点を補うために Map が実装された、そして正式名称はあくまで連想配列ではなくオブジェクトと Map であるという認識です。
m.ts10806

2019/08/21 01:36

詳細説明ありがとうございます。 「JavaScriptは全てオブジェクトであって連想配列という概念はない」というのももともとは先輩エンジニアからの教えで そのときに調べた記事を読んで納得していたレベルなので、一歩踏み込んだ内容を聞けて良かったと思います。 質問者が「オブジェクト連想配列」という言葉を作ってしまって更にごちゃごちゃになっていっているのは多少気がかりですけど;
Zuishin

2019/08/21 01:49 編集

私のコメントのことなら、説明というより、私の勝手な解釈なので「こういう意見もあるのか」くらいに読んでいただければ。 「全ての文字列をキーにできない」というのは連想配列として重大な欠陥なので、「オブジェクトは連想配列ではない」という先輩の意見は一理あるものと思います。
m.ts10806

2019/08/21 01:45

良く読んだら「詳細説明ありがとう~~」と始めながら「一歩踏み込んだ内容を聞けて」って合ってませんね。 本来は「良い意見を聞けた」と書きたかったので、冒頭はちょっと表現のミスです。
m.ts10806

2019/08/21 02:35

>「全ての文字列をキーにできない」というのは連想配列として重大な欠陥なので、「オブジェクトは連想配列ではない」という先輩の意見は一理あるものと思います。 ありがとうございます。Web系の知識や技術の特に応用的な部分はほぼその先輩に叩き込まれたようなものなので他をあまり知らなかった私からすると、Zuishinさんのような意見やフォローを聞けて良かったと思います(teratailでの活動が成長の糧になっていると感じる瞬間です)
m.ts10806

2019/08/21 03:56

-2ってなんだろう。 ここまできて何もコメントなしというのはまたいつものあれですかね。
m.ts10806

2019/08/21 11:43

そんなにヘイトを集めるような回答だろうか。さすがに無言低評価で5はおかしい。
Zuishin

2019/08/21 11:56

回答は特におかしなところは無いと思うので、嫌がらせでしょうか。にしても多いですね。
m.ts10806

2019/08/21 12:01

このユーザーが出てきてしばらくしてくらいですが、似たシステムをもったユーザーが持っている別アカウントを疑っています。 このユーザーが出てきてからくらいから活動なくなってますし(まだ残ってるみたいだけど) 無言低評価つけたところで誰のためにもならないんですけどね。きっちり技術的に指摘してほしい。 できないなら引いてほしい。エンジニアとしてありえない。
think49

2019/08/21 12:44

回答は間違ってないと思いますが、「連想配列とは何なのか」「オブジェクト初期化子とは何なのか」をより具体的に書くと、低評価は免れたのではないかとも思います。 ぐぐれば分かりますが、m.ts10806 さんの口から具体的な違いを聞きたかったですね…。 https://teratail.com/search?q=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E5%88%9D%E6%9C%9F%E5%8C%96%E5%AD%90+%E9%80%A3%E6%83%B3%E9%85%8D%E5%88%97+map+tag%3Ajavascript https://qiita.com/think49/items/0c5ea1c9e2545fa2eed2#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AEkeyvalue%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B 後は直接的な回答ではなく、「指摘」に留まっている事でしょうか。
m.ts10806

2019/08/21 12:56 編集

ご指摘ありがとうございます。 私としては質問に合わせた上での回答にしています。 本当に調べたかどうか分からないし、この質問者が丸投げを繰り返しているのは間違いない中で「どこまでの回答をするべきか」考えた結果です。 おっしゃる通り「ググれば分かること」なので、調べ方がマズイ可能性もあるわけで、それなら調べ方をアドバイスしたほうが今後のためにもなります。 ただ、追記修正依頼を書いても無反応。それなら仕方ない、簡単な概要と指摘のみにとどめるしかないか、となったわけです。 もちろん質問者本人から何かしらアプローチがあれば次の展開はあったはずですが、ない上に別回答にしたコメントを見るとそれすら理解が及んでなさそうなので、あまり具体的な回答をしたところで理解は得られないし、思い違いの修正に終始することになるなとは感じています。 (その手の相手にはそれなりのやり方になってしまいますね。低評価してもその指摘をしても無視するので成長は見込んでる人はあまりいないかなあと) ただ、そこまで無言で低評価すること?とは思ってます。
think49

2019/08/21 13:13

そこまで考慮されたのであれば、この質問者さんが意に添わぬ回答をスルーするスタンスである事を想像できても良かったのではと。 質問者にはスルーされ、第三者には低評価され…、だと報われないので、「誰に向けて回答を書いているのか」を意識してみると良いかもしれません。 ※私も https://teratail.com/questions/205299 と同一人物の可能性を想定しています。 https://teratail.com/questions/205199 が発端で気にしていましたが、深く掘り下げられると逃げてしまう性格のようですね。 > ただ、そこまで無言で低評価すること?とは思ってます。 この内容なら、私は補足要求欄に書きます。 m.ts10806 さんの方法は「他に回答がない」なら有効ですが、他に有効な回答が付いた時点で無視されて終わるのが目に見えています。
m.ts10806

2019/08/21 13:37

そうですね。ただ投稿時間見てもらえればわかりますが、私が回答作り始めたときにはだれも回答してなかったので(maisumakunさんと1分差)、指摘もらいつつ修正することで伝わるのかなとは思ってました。 無視されて終わるならいいですけど、低評価が荒らしレベルでつくと話は違ってきそうです。 私も提示されてるユーザー自体がまた別のユーザーと同じ疑惑は持ってたので、複数アカウントにも程があるんじゃないかとは思います。 私の回答に低評価集中してることから、持ってるアカウント総動員した形でしょうかね。 低評価できるくらいまで育ててやってるとしたら不純すぎる。本当なら二度とプログラミングに触れないでほしい。
退会済みユーザー

退会済みユーザー

2019/08/21 13:45

多分「偉そうに上から言ってる割に色々突っ込まれて知識無いじゃねーか!お前もググれよ!」の低評価
m.ts10806

2019/08/21 14:03

回答に「[javascript オブジェクト 連想配列 違い]で調べれば幾らでも解説記事がでてきます。」と書いていますしキーワードは提示しています。 この回答内容で上からだなんだウダウダ言うのでしたらフォローはできないですね。 文句あるならteratailのガイドラインに文句言ってもらいたい。
退会済みユーザー

退会済みユーザー

2019/08/22 00:03 編集

俺は高評価も低評価もしてないけど、どちらかといえば低評価を入れるかなあ。 ECMAScriptのコンテキストで「連想配列」という語句が用いられるかどうかと、それが「連想配列」というデータ構造にあたるものかは別の問題だと思う。 別にどちらをどう呼ぶかなんてこだわる必要を感じないけど、この説明だと混乱しそうだなあって感じはします
m.ts10806

2019/08/22 00:05

そうですね。ちょっと今後半を大幅改修中です。 この質問者が見るかどうかは別として、ある程度検証コードは必要に思いました。
Zuishin

2019/08/22 00:52

> もはや「配列」って便宜上そう呼んでいるだけでプログラミング言語上は正しくは「全てオブジェクト」ということなのかなと思いました。 言語が変わると配列の定義も変わります。JavaScript の話で PHP は不適当ではないでしょうか。 C 言語や C# では、配列はインデクスでアクセスできるメモリの連続領域のことで、要素数を自由に変更することはできません。 PHP の配列は順番付けられたマップのことであるとマニュアルに書かれている通り、配列と言うより連想配列の一種と言うのが適当かと。 JavaScript の配列は他の言語ではリストと呼ばれるかもしれません。 それぞれ別のデータ構造です。
m.ts10806

2019/08/22 00:58

んーそうですね。 ちょっと「配列は配列または文字列だけ持てて、メソッド(処理・ロジック)は持てない」という自身の思い込みもあったので確かめてみたのがたまたまPHPだったので蛇足として追記した上で「思いました」で締めました。 そのあたりはまだふわっとしたところがあるのは確かなので(特にCはコードを読ませてもらったことがある程度で書いたことがない)、確固たるものにしていく必要はあるかなと思っています。 まだまだ「動いてるからOK」で済ませてしまっているところは少なからずありますね。 今回は色々と勉強になることがあったトピックでした。
m.ts10806

2019/08/22 01:06

PHPをだしたのも私自身が主としているものとあるというのもありますが、 この質問者も過去に何度かPHPに関する質問をしているので、共有の意味もあります。
Zuishin

2019/08/22 01:19 編集

オブジェクトは適当な訳語がありませんが、「物」ではなく、「目標」と訳す方がまだ近いかと思います。SVO 構文の O です。「物」と訳すと、たいてい間違えます。 プログラミング上はと言うより、言語のポリシーによってどこまでオブジェクトとして扱えるかが決まっていますが、配列はほぼ全てのオブジェクト指向言語でオブジェクトになっていると思います。
m.ts10806

2019/08/22 01:23

(外してたらすみません) 「物体」「対象」と色んな日本語訳があるので文脈で意味が変わってくるのもオブジェクトらしさと思います。 「目標」だとtargetのほうに寄ってしまうように思いますが・・。確かに「目的語」となると「Object」ですね。 >配列はほぼ全てのオブジェクト指向言語でオブジェクトになっていると思います。 はい。私もPHPまで検証したことで理解は深まりました。
Zuishin

2019/08/22 01:36

文脈で意味が変わるのは英語の「オブジェクト」ですが、オブジェクト指向の「オブジェクト」は「オブジェクト指向という文脈の中で」のオブジェクトなので、ある程度意味は決まっていると思います。 「目標」より「対象」の方がいいですね。しかし「物体」はダメです。オブジェクトは物体ではあり得ません。 先日、ゲームで敵をどのようにオブジェクト化するかという質問があり、ある回答者は「敵の動きをメソッドにすべき」と答えました。オブジェクトを物体ととらえるなら、動きはまさにメソッドでしょう。しかし現実には、動きはプロパティ、つまりオブジェクトとして実装するのが一番うまくいきます。「動き」という何ら物質性のないものをオブジェクトと認識できるかどうかは結構重要なことだと思います。したがって、入門書でよくある「オブジェクトは物」という教え方には全く賛成できません。単に英語の直訳に「物」があり、それを全く文脈の違うところで使っているようなものだと思います。
maisumakun

2019/08/22 01:44

> 配列はほぼ全てのオブジェクト指向言語でオブジェクトになっていると思います。 C++はC言語から引き継いだ「オブジェクトでない配列」も現役ですし、PHPではオブジェクトが参照型なのに対して配列はCopy on writeを行う値型として扱われていますし、Javaでも配列は参照型ではありますがObjectとは別系統の存在です。 よく使うがゆえに、特殊な挙動が残ってしまうのかもしれません。
m.ts10806

2019/08/22 01:58 編集

>「目標」より「対象」の方がいいですね。しかし「物体」はダメです。オブジェクトは物体ではあり得ません。 「モノ」という言葉自体が抽象的なところもありますね。 Object自体が色んな「モノ」として扱えるかなというのでこれまで納得してきていました。 要は使い方次第だということで。 > 何ら物質性のないものをオブジェクトと認識できるかどうかは結構重要なことだと思います 私もそう思います。
Zuishin

2019/08/22 02:50

maisumakun さん、ありがとうございます。「ほぼ」と書いたのは C++ を除いてという意味だったのですが、他の言語に対しても私の認識が甘かったようです。PHP の配列が値型だからオブジェクトでないというのは微妙な気がしますが、PHP の定義でオブジェクトがそうなっているのなら、配列はオブジェクトではないということになりますね。 ここで私の言った「オブジェクト」は、「Object クラスから継承されたクラスのインスタンス」ではなく、「メソッドやプロパティを実装し、変数への代入ができるなど処理の対象となるもの」というものが頭にありましたが、定義は言語によりますね。
guest

0

ベストアンサー

quizSetは、配列の中に、オブジェクトが格納されている、多次元のオブジェクト連想配列であるとの認識で正しいでしょうか?

いえ、命題のquizSetはオブジェクトが格納された単なる配列です

投稿2019/08/21 01:06

yambejp

総合スコア114779

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

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

aae_11

2019/08/21 10:01

ご回答ありがとうございます。 つまり、配列内に文字列や数値が格納されているように、オブジェクトが代わりに挿入されている、といった認識で良いのでしょうか?
yambejp

2019/08/21 10:10

配列の要素としてはリテラルな数字や文字列以外に、オブジェクトやDOMなど javascriptで処理できる大抵のものは保持できます
aae_11

2019/08/21 10:15

ご返信ありがとうございます。 勉強になりました。
guest

0

オブジェクトと連想配列とが若干混乱してしまった為、ご質問させて貰いました。

JavaScriptの場合、{ }で書くようなオブジェクトリテラルは、連想配列としても利用可能です(ただし、オブジェクトであるためtoStringのような一部のキーが使えないなどの制約があります)。

投稿2019/08/21 01:01

maisumakun

総合スコア145183

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

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

aae_11

2019/08/21 01:06

ご回答ありがとうございます。 波括弧でも、「プロパティ+値」といった形で連想配列が定義可能といった訳なんですね。
m.ts10806

2019/08/21 01:21

「連想配列として」と回答者があえて「として」を入れていることをスルーしてはいけませんよ。 あくまでlikeです。イコールではありません。
guest

0

配列の中に、オブジェクトが格納されている、多次元のオブジェクト連想配列であるとの認識で正しいでしょうか?

違います。
まずは配列と連想配列の違いを理解しましょう。

投稿2019/08/21 03:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問