・色々やっている内よく分からないデータになったので、連想配列/オブジェクト? どちらなのか教えてください
■前提オブジェクト
var t1 = { key1: '佐藤' , key2: '鈴木' };
■配列作成
var t2 = new Array();
■配列にオブジェクトを格納?
t2[t1['key1']]=t1['key2'];
console.log(t2); //[佐藤: "鈴木"]
■アクセスしてみる
console.log("t2['佐藤']"); //鈴木
console.log(t2[0]); //undefined
■質問
・t2[0]は、なぜundefined?
・t2配列0番目に「佐藤: "鈴木"」というオブジェクトが入っていると思ったのですが…
・t2は、連想配列/オブジェクトの何れでしょうか?
・挙動から推測するとオブジェクトっぽいのですが、外側のかっこが[]でもオブジェクトなのでしょうか?
・外側のかっこが[]は配列で、外側のかっこが{}はオブジェクトと思っているのですが…
No.4ベストアンサー
- 回答日時:
#1 です。
連想配列ではありませんが、ES6 規定の Map が re97 さんの求めるものに近いかもしれません。
Object と違い、「定義順で反復処理」できますし、「key を追加すれば length に反映」されます。
https://developer.mozilla.org/ja/docs/Web/JavaSc …
---
うすうすお気づきだと思いますが、ECMAScript の new Array は数値添字配列(かつオブジェクト型ですし、new Object は key と value を定義できるだけで「配列」としての機能はありません。
あくまで「連想配列」を求めるのなら
var a = [{key1: '佐藤'}, {key2: '鈴木'}];
のように定義して for, forEach で走査するのが現実解だと思います。
ES6 が普及したら Map に移行すればいいでしょう。
# Re: re97 さん
回答ありがとうございました。
>Object と違い、「定義順で反復処理」できますし、「key を追加すれば length に反映」されます
・定義順は当然保障されるものと思い込んでました…
>ECMAScript の new Array は数値添字配列(かつオブジェクト型ですし、new Object は key と value を定義できるだけで「配列」としての機能はありません
・なるほど
・ここら辺が頭の中でごっちゃになってました
・説明分かりやすかったです
・勉強になりましたー
No.7
- 回答日時:
「連想配列」という言葉ですが、
私は「文字列をキーにして値を取得できるデータタイプ」の意味で使っているので
私の回答についてはそのように解釈してください。
(なので、Objectを「文字列をキーにして値を取得できるデータタイプ」として使える、のように言い換えても良いです。)
また、私の回答の中では、「連想配列」の要件に
lengthプロパティや配列のメソッド、順序保持は含めていないです。
「配列」も非負整数をキーにして値を取得できればよくて
lengthとか各種メソッドが配列の本質的な要件とは考えてなかったですね。
(もちろんあったら便利だけど。)
実際C言語だと、配列にlengthやメソッドに相当するものは無かったし。
補足ありがとうございました。
>「連想配列」という言葉ですが、
>私は「文字列をキーにして値を取得できるデータタイプ」の意味で使っている
・どこまでの機能を指して「連想配列」と看做すか、の違いだと解釈しました
・参考になりましたー
No.6
- 回答日時:
#1,4 です。
意見の相違が見られるようなので、私が「new Object が連想配列ではない」と思う根拠を示しておきます。
1. ECMAScript で連想配列が定義されていない
言葉通りです。
少なくとも、ECMAScript 5 までに連想配列の文字は出てきません。
2. lengthプロパティがない
「配列」というからには配列の長さを確認できなければなりません。
3. 配列のメソッドを使えない
連想「配列」なのですから forEach のような配列用メソッドがあってしかるべきです。
4. 定義順で列挙できない
for-in は ES5 規定では列挙順がランダムです。
---
var obj = {key2: 'hoge', key1: 'foo'};
for (key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key + ': ' + obj[key]);
}
}
---
Google Chrome 38 では定義順(key2 -> key1)で列挙してくれましたが、全ての実装で同じ順序で列挙される保証はありません。
回答&詳細な説明、ありがとうございました。
・「キーと値のペア」という点だけみれば連想配列と同じだが、実際にはこれだけ相違点がある、ということでしょうか?
・大変参考になりましたー
>Google Chrome 38 では定義順(key2 -> key1)で列挙してくれましたが、全ての実装で同じ順序で列挙される保証はありません
・情報ありがとうございました
・ブラウザの挙動から勝手に仕様を推測する、のは止めた方がよいことが分かりました
・参考になりましたー
No.5
- 回答日時:
JavaScriptのオブジェクトは連想配列です。
ただしkeyにはStringかSymbolしか使えません。
もしそれ以外の型を使うと文字列化されて利用されます。
keyにオブジェクト等を使いたいのであればMapを使ってください。
また、将来的にはオブジェクト同士の関係を作れるようにもなります。
https://github.com/zenparsing/es-abstract-refs
回答ありがとうございました。
>keyにはStringかSymbolしか使えません
・Symbolって何だろうと思い調べたら、ES6から導入される新しい型なんですね
・型が増えるとか想像もしてなかったのでびっくりしましたー
No.3
- 回答日時:
> ・それとも、console.logが単にそうなっているから?
console.logがそうなっているだけの話で、正直どうでも良いと思う。
standardがあるわけでもないし、console.log作った人がこんな風に表示したら分かりやすいと考えただけじゃないの?
var t = [];
t[0] = "A";
t[1] = "B";
t[2] = "C";
t[3] = "D";
t[6] = "E";
t[9] = "F";
console.log(t);
//Firefox => Array [ "A", "B", "C", "D", , , "E", , , "F" ]
//Google Chrome => ["A", "B", "C", "D", 6: "E", 9: "F"]
回答ありがとうございました。
>standardがあるわけでもないし、console.log作った人がこんな風に表示したら分かりやすいと考えただけ
・console.log結果って、ブラウザ間によってこんなにも違うんですね
・かなりびっくりしましたー
No.1
- 回答日時:
JavaScriptでオブジェクトと連想配列は同じものですよ。
連想配列によってオブジェクトを実現していると言ったら分かりますか?
> var t1 = { key1: '佐藤' , key2: '鈴木' };
このt1だってt1['key1']のように文字列をキーにして要素にアクセスできるので
連想配列そのものです。
(そもそもの話として、連想配列が文字列をキーにして要素にアクセスできる配列のことであるというのは分かってますよね?)
> console.log("t2['佐藤']"); //鈴木
ケアレスミスでしょうけど、
" " で囲っちゃダメだと思います。
> ・t2[0]は、なぜundefined?
t2[0]に何も代入していないのだから当たり前です。
> ・t2は、連想配列/オブジェクトの何れでしょうか?
t2は配列オブジェクトです。
> ・挙動から推測するとオブジェクトっぽいのですが、外側のかっこが[]でもオブジェクトなのでしょうか?
配列だってオブジェクトの一種ですよ。
誤解を恐れずにざっくり言うと、Objectにいろんな配列用のメソッドを付加したらArrayになります。
検索したら良さそうな説明見つけたので紹介しておきます。
(連載なので全記事に全部目を通しても良いかも。)
JavaScriptのオブジェクトとは:ちゃんと理解してますか - builder by ZDNet Japan
http://builder.japan.zdnet.com/script/sp_javascr …
とても”奇妙”なJavaScriptの配列:JavaやCとは違うのだよ - builder by ZDNet Japan
http://builder.japan.zdnet.com/script/sp_javascr …
この回答への補足
回答ありがとうございました。
分からないことが出てきたので追加で教えてください
>t2[0]に何も代入していないのだから当たり前
・0へ代入してみました → t2[0]='山田';
・console.log(t2); //["山田", 佐藤: "鈴木"]
・取得できました → console.log(t2[0]); //山田
・4へ代入してみました → t2[4]='山田';
・console.log(t2); //[4: "山田", 佐藤: "鈴木"]
・取得できました → console.log(t2[4]); //山田
■質問
・「0」へ代入した時と「4」へ代入した時でconsole.log表示が異なるのはなぜでしょうか?
・[0: "山田", 佐藤: "鈴木"]を期待していたのに、["山田", 佐藤: "鈴木"]と表示される
・0には何か特別な意味があるのでしょうか?
・それとも、console.logが単にそうなっているから?
・あまり気にしなくても良い?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP クラス 1 2022/08/08 15:12
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- JavaScript オブジェクト配列の各メンバを任意の式で評価して、その評価値が最大のオブジェクトを返す関数はありますか 2 2023/05/20 15:02
- Microsoft ASP プログラミング関係で質問です。 3 2022/10/11 16:06
- Visual Basic(VBA) Excel・ユーザーフォームの情報を受け渡したい 4 2022/06/08 10:11
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- 計算機科学 急ぎです、大学数学再帰の問題難しくてがわからないです。 以下の4つの文字列を連結して新たに生成できる 1 2023/05/17 20:11
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- Java 複数TBLのオブジェクトを1つの変数(オブジェクト)でまとめて管理したい 1 2022/12/17 00:12
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#テキストボックスの文字を配...
-
jspからjavascriptの変数引継ぎ
-
JavaScriptで配列を取得したい
-
二次元配列の全要素の全要素を...
-
外部csvデータを読み込む(d3.js)
-
フォーム入力値の重複チェック
-
JavaScriptでの動的な多次元配...
-
同じIDで定義した要素の配列を...
-
javascriptで行を抽出したいです。
-
jQueryで文字数カウンタ(複数...
-
ActiveXobjectが作成できない
-
JavaScriptで決まった「時刻」...
-
Boolean型配列中のTrueの有無を...
-
google apps scriptの終了のさせ方
-
関数でy=g(x)のgとは何の略です...
-
任意の座標をクリックさせるには
-
Linux バイナリ実行できない "...
-
javascriptでスロットゲームを...
-
window.openでタイトル名の指定
-
javascriptでiframeのURL変更は?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
同じIDで定義した要素の配列を...
-
C#テキストボックスの文字を配...
-
React hooksが値を返して配列変...
-
オブジェクトから任意のプロパ...
-
javascript 変数名の連結をしたい
-
jspからjavascriptの変数引継ぎ
-
配列の1要素を代入した変数を使...
-
JavaScriptにおける[] とか :...
-
フォーム入力値の重複チェック
-
javascriptで行を抽出したいです。
-
undefinedを表示させない方法は...
-
javascriptで2つのArrayの...
-
WSH(Jscript)でファイル一覧
-
JavaScriptでの動的な多次元配...
-
Perlの配列をJavaScriptに渡せ...
-
[JS] setAttributeで保存される...
-
JSONデータを50音順でソートしたい
-
二次元配列の全要素の全要素を...
-
javascriptを用いて作成された...
-
バナーのランダム表示(複数、...
おすすめ情報