連想配列は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
引数のオブジェクトはname
とage
の2つのキーを持っていましたね。
なのでこれらのキーだけを抜き出した配列を新しく作って返します。
ん?配列???だったらlengthで要素数抜き出せますよね、という理屈でオブジェクトの要素数を抜き出す事に成功しました。
このようにJavaScriptのオブジェクトと配列は明確に分かれているので、
この値がどちらかを理解して、変換を明示するようなコードを書くように注意してくださいね。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。