スタートページJavascript

連想配列


通常の配列は、「配列名[添字]」の形式で要素が特定され、添字は自然数に限定されています。それに対して、連想配列では、添字に相当するものが文字列で、それをキー名といいます。
連想配列は、一つの要素は「キー名:値」のペアになっており、「配列名["キー名"]」または「配列名.キー名」の形式で要素を特定します。

JavaScript では、連想配列データのことを Object型データ ということがあります。


一次元連想配列

  var 連想配列 = {}:
    連想配列["キー1"] = 10;
    連想配列["キー2"] = 30;
    連想配列["キー3"] = 20;
次のように記述することもできます。
var 連想配列 = { キー1: 10, キー2: 30, キー3: 20 };

連想配列のサイズは、
  配列長 = 配列.length;
ではなく、
  連想配列長 = Object.keys(連想配列).length;
となります。
  キー配列 = Object.keys(連想配列);
とすると、全てのキーが配列で入ります。
  キー配列[0];
とすれば、定義した最初の要素のキーになります。

また、全配列を操作するのに、
    for (i==0; i<配列.length; i++) {   }
は使えません。それにかわって、
    for (キー in 連想配列) {   // キーは任意の変数
      連想配列[キー] を用いた処理
    }
とします。これは「配列のなかにあるすべての要素(キー)について」の意味です。



2次元連想配列

連想配列の記法

  var 学生 = {};
    学生["阿部"] = [];
      学生["阿部"]["氏名"] = "阿部";
      学生["阿部"]["学部"] = "文学部";
      学生["阿部"]["入学"] = 2010;
    学生["井上"] = [];
      学生["井上"].氏名 ="井上";
      学生["井上"].学部 ="工学部";
      学生["井上"].入学 = 2012;
    学生["宇野"] = { 氏名:"宇野", 入学:2011 }; // 学部を未定義にしています。

多様な記述方法がありますが、どれも同じで結果として次の二次元配列になります。
 学生[i][j]
    ↓i j→ 氏名  学部  入学
    阿部    阿部  文学部 2010
    井上    井上  工学部 2012
    宇野    宇野    2021

(注)現実には、学生["阿部"] のようにキーを名前にするのではなく、学生["106123"] のように学籍番号にするのが通常です。このとき、「キーは文字列」であることに注意してください。学生[106123] とすると、自動的に "106123" に変換するのが通常ですが保証はありません。特に先頭が 0 のときの扱いや 10-6-123 のような場合の文字列変換は微妙ですので、必ず文字列にしてください。なお、数字から成るキーであっても、その大小関係は存在しません。

未定義のチェック

存在しない要素は Undefined (if では false)になる
    学生["江川"]   学生["阿部"].学年  どちらも undefined
次の記述ができます。
    var キー = ... "阿部" "江川" など
    if (学生[キー]) {
      学生["阿部"]の場合 存在するときの処理
    }
    else {
      学生["江川"]の場合 存在しないときの処理
    }
学生["阿部"].学年 の場合
     if (!学生["阿部"].学年) 学生["阿部"].学年 = 3; // 改めて定義をする

Object.keys() について
    Object.keys(学生)      → [ 阿部, 井上, 宇野 ]
    Object.keys(学生["阿部"])  → [ 氏名, 学部, 入学 ]

全体の走査

通常の配列ならば、
    for (var i=0; i<配列.length; i++) {
      for (var j=0: 配列[i].length; j++) {
        var 要素 = 配列[i][j];
      }
    }
とするところ、連想配列では次のように記述します。
    for (var キー in 学生) {
      for (var 属性 in 学生[キー]) {
        var 要素 = 配列[キー][属性];
      }
    }


ソート

話を単純にするために、上掲の一次元配列を例にします。
  var 連想配列 = {}:
    連想配列["キー1"] = 10;
    連想配列["キー2"] = 30;
    連想配列["キー3"] = 20;
ここで「値の昇順に連想配列をソートせよ」という問題を考えます。

そもそも連想配列には順序の観念はありません。しかし、作表する場合には昇順に表示するなど順序が必要な場合があります。それには、順位キーという配列を生成して、順位キー[0] = "キー1"、順位キー[1] = "キー3"、順位キー[2] = "キー2"となるようにすれば、次のように順に処理をすることができます。すなわち、問題は「順位キーを作成せよ」となります。
  if (ver i=0: i<連想配列数; i++) {
  var キー = 順位キー[i];
    連想配列[キー] ・・・・・
  }

通常の配列での順位付けのアルゴリズムは次のようになります。説明は省略します。
  function 順位付け() {
    var 配列 = [ 30, 20, 50, 10, 40 ];
    var 順位 = [];
    var 配列数 = 配列.length;
    for (var i=0; i<配列数; i++) {
      var k = -1;
      for (j=0; j<配列数; j++) {
        if ( ( 配列[j] < 配列[i] )
         || ( 配列[j] == 配列[i] ) && (j <= i ) ) {
          k++;
        }
      }
      順位[k] = i;     }
  }
結果は、順位 = [3, 1, 0, 4, 2] になります。順位[0]=3 とは、配列で最も小さいのは 配列[3]=10、次は順位[1]=1 で 配列[1]=20 であることを示しています。

これを連想配列に翻訳すると、次のようになります。
    for (var i=0; i<連想配列長; i++) {
      var キーi = キー配列[i];
      var k = -1;
      for (var j=0; j<連想配列長; j++) {
        var キーj = キー配列[j];
        if ( ( 連想配列[キーj] < 連想配列[キーi] )
         || ( 連想配列[キーj] == 連想配列[キーi] ) && (j <= i ) ) {
          k++;
        }
      }
      順位[k] = i;
    }
ここで、順位 = [ 0, 2, 1 ] となっています。

順位を順位キーにするには、
順位キー[i] = キー配列[順位[i]];
とするだけです。
順位キー = [ "キー1", "キー3", "キー2" ] になります。
そして、連想配列の値は
  連想配列[順位キー[i]]
になるので、
 i=0 → 順位キー[0]="キー1" → 連想配列["キー1"]=10
 i=1 → 順位キー[1]="キー1" → 連想配列["キー3"]=20
 i=2 → 順位キー[2]="キー1" → 連想配列["キー2"]=30
となり、昇順に並んでいることがわかります。

二次元連想配列「学生」で「入学」の昇順に並べます。
一次元のときと、ほぼ同じですので、ソースを見てください。