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

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

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

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

Q&A

解決済

3回答

869閲覧

連想配列の要素数の取得について

ryoo_chksl

総合スコア69

JavaScript

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

0グッド

0クリップ

投稿2018/11/19 08:46

連想配列はlengthでは取得できないと説明しているサイトがあります。

例えば、以下のような連想配列があるとします。

javascript

1var people = [ 2 {name: 'taro', age: '21'}, 3 {name: 'hanako', age: '20'}, 4 {name: 'ziro', age: '18'}, 5 {name: 'saburo', age: '16'}, 6 {name: 'siro', age: '13'} 7]

これを次の2種類の方法で要素数を取得しました

javascript

1console.log(people.length); //A 2console.log(Object.keys(people).length); //B

コンソールをみるとどちらも「5」と表示されていました。連想配列で要素数を取得するときはBの方法でやるよう説明していましたが、Aだとダメなのですか?

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

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

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

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

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

guest

回答3

0

連想配列はlengthでは取得できないと説明しているサイト

質問者さんの勘違いですね、例示の「people」はただの配列で連想配列とは言えません
なので普通にlengthが拾えます

投稿2018/11/19 08:52

編集2018/11/19 08:53
yambejp

総合スコア114810

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

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

0

連想配列はlengthでは取得できないと説明しているサイトがあります。

そもそもJavaScriptに連想配列というものはありません。

確かにJavaScriptの配列とオブジェクトの組み合わせで、
PHPの連想配列に似たようなデータ構造を実現することが可能ですが、
PHPの凄まじくフレキシブルな配列と連想配列のごちゃまぜのようなデータ構造は表現出来ません。

つまり、今回の話は言語構造の中枢に近い話になるので、
PHPの用語である連想配列とJSの配列・オブジェクトを混同したままでは一生理解出来ませんから、正しい情報や用語でやり取りするようにしてください。

以下のような連想配列があるとします。

君はオブジェクトの配列でしょ。
JSではこういう二次元データを「オブジェクト」の「配列」として表現します。
PHPの二次元連想配列に酷似したデータ構造です。

連想配列で要素数を取得するときはBの方法でやるよう説明していましたが、Aだとダメなのですか?

なんで今まで私が「オブジェクト」と「配列」と明確に分けているかというと、
JSのオブジェクトと配列は、PHPの配列と連想配列とは違って明確に違うものだからです。

オブジェクトと配列にlengthプロパティが存在するか否かを確認してみましょう。
下記のサイトはFirefoxというブラウザを作っているチームのJavaScriptの説明サイトで、正式な仕様に準拠しているフロントエンドエンジニアのバイブル的なサイトです。

[1, 2, 3]という書き方で生成した「配列」にはlengthプロパティは存在する。
{name: "taro"}という書き方で生成した「オブジェクト」にはlengthプロパティは存在しない。
PHPで言えばAクラスをnewして作ったaインスタンスと、Bクラスをnewして作ったbインスタンスくらいの違いがあります。

これ混同するとエラーだらけでまともにプログラミング出来ないので、
しっかり覚えて帰ってくださいね。

console.log(Object.keys(people).length);

確かにこのやり方はオブジェクトの要素数を抜き出すのに必要です。
そもそもこれが何やってるのか確認してみましょう。

JavaScript

1var people = {name: 'taro', age: '21'}; 2 3console.log(Object.keys(people)); 4// ["name", "age"] 5 6console.log(Object.keys(people).length); 7// 2

注目はObject.keys(people)の結果です。
オブジェクトではなく["name", "age"]に変化していることが分かります。
これはまごうことなき配列ですね。

Object.keysはオブジェクトを引数にとり、配列を返すメソッドです。
Object.keys - MDN

引数のオブジェクトはnameageの2つのキーを持っていましたね。
なのでこれらのキーだけを抜き出した配列を新しく作って返します。
ん?配列???だったらlengthで要素数抜き出せますよね、という理屈でオブジェクトの要素数を抜き出す事に成功しました。

このようにJavaScriptのオブジェクトと配列は明確に分かれているので、
この値がどちらかを理解して、変換を明示するようなコードを書くように注意してくださいね。

投稿2018/11/19 10:18

編集2018/11/19 10:19
miyabi-sun

総合スコア21158

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

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

think49

2018/11/20 00:16

用語の正確性という観点なら、 > JSではこういう二次元データを「オブジェクト」の「配列」として表現します。 私はこの表現を始めて時に混乱しました。 new ArrayはObject型であり、オブジェクトではない配列は有り得ない、と感じていました。 > なんで今まで私が「オブジェクト」と「配列」と明確に分けているかというと、 文脈的に「オブジェクト = new Object」と定義しているようてすが、これも誤解の元だと思っています。 私はオブジェクトはもっと広義で「Object型の値」と認識しているので、その表現をされると「new Object」なのか「Object型の値」なのか、を文脈で読む努力を強いられます。 > このようにJavaScriptのオブジェクトと配列は明確に分かれているので、 配列はObject型なので、個人的には、「配列はオブジェクトの一種」とする方がしっくりきますね。 new Objectとnew Arrayは別物ですが、連想配列として見ると、Object.create(null)やnew Mapに有用性を感じます。 https://gist.github.com/think49/31a2cedb5c653fd18086ade669c04323
think49

2018/11/20 00:21

> JSではこういう二次元データを「オブジェクト」の「配列」として表現します。 「数値添字配列」という言葉があるぐらいなので、「オブジェクト要素値配列」と表現するのも有りかもしれません。
guest

0

ベストアンサー

ご提示のpersonはjavascriptのobjectの配列ですし、この使いかたは適切だと思いますが、仮にperson自信を連想配列的(lengthが取れないように)宣言するとしたらこう。

javascript

1const person = { "john" : 21 , "jane" : 22}; 2console.log(person.length); //undefined 3console.log(Object.keys(person).length); //2

投稿2018/11/19 09:02

papinianus

総合スコア12705

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問