注:
この回答の最初のセクションでは、JS の配列とオブジェクトの違いを理解していること、およびキーとして使用している値が文字列ではなく数値であることを前提としています。
まず最初に。data
どのような場合でも、オブジェクト リテラルではなく、配列の json 表現であることを確認してください。を試してconsole.log(data);
、コンソールを確認してください。次のようなものが表示された場合:
"{"1":"123"}"
配列ではなくオブジェクトであるため、for
ループはそれをカットしません。jPunten
配列は次のようになります。
"[123,4342]"
オブジェクトのループは、for...in
ループを使用して行われます。
for(var property in jPunten)
{
if (jPunten.hasOwnProperty(property))
{
console.log(jPuntent[property].CARDNR);//this will work
}
}
ただし、JSON 形式の詳細についてはjson.orgにアクセスし、たとえばhasOwnProperty
. MDN には便利な list もあり、JS で使用できるループの種類ごとに優れたドキュメントがあります。
とにかく、当面の問題に戻ります。
数字キーのみ:
変数を JS の 2D 配列に初期化する場合は、メイン配列内で 2 番目 (内部) の配列を宣言する必要があります。
要するに:
var puntmap = [][];//WRONG
//should be:
var puntmap = [[]];
あなたがそれについて考えるなら、それは理にかなっています: もし[]
が配列なら、それから[][]
2 つの別々の配列です。1 つの配列が他の配列の一部である必要がある場合は、その配列内に単純に記述します。
[//an array
[]//first element in the array => an array
]
しかし、スパース配列を作成しているように見える場合 (スパース配列の概念を説明しているこの質問に対する私の回答を確認してください)、オブジェクト リテラルを検討するか、単にpuntmap
古い配列として宣言することをお勧めします。
次に、次のように配列にデータを入力します。
var puntmap = [];
for (var i=0;i<jPunten.length;++i)
{
//create an array under key jPunten[i].CARDNR, if it doesn't exist already
puntmap[jPunten[i].CARDNR] = puntmap[jPunten[i].CARDNR] || [];
//then, assign your value
puntmap[jPunten[i].CARDNR][jPunten[i].BITNR] = jPunten[i].STATDEV;
}
キー (プロパティ) としての文字列定数
この (jPunten[i].CARDNR
などの) 仮定が数値である場合、それが誤りである場合は、オブジェクトを直接使用することを検討してください。とにかく、配列はオブジェクトに強制されます。コードだけで誰もlength
プロパティを信じることができず、他の配列メソッドが利用可能です...
var puntmap = {};//create object literal
for (var i=0;i<jPunten.length;++i)
{
//create an array under key jPunten[i].CARDNR, if it doesn't exist already
if (!puntmap.hasOwnProperty(jPunten[i].CARDNR))
{//if object does not have property
puntmap[jPunten[i].CARDNR] = {};//create child object literal
//or, if jPunten[i].BITNR is always numeric:
puntmap[jPunten[i].CARDNR] = [];//you can use an array here!
}
//then, assign your value as you would
puntmap[jPunten[i].CARDNR][jPunten[i].BITNR] = jPunten[i].STATDEV;
}
オブジェクトリテラルを使用しているため、コードは誰も混乱させず、誰も次のようなことを試みません。
puntmap.slice(12,3);
オブジェクト(PHPで言えば連想配列)でエラーがスローされます。