1

私が探しているのは、このコードに相当する Javascript です。

$map[$card][$bit] = $val;

(ご存じのとおり、これにより配列もすぐにインスタンス化されます)

少し調べてみましたが、これを行うには他にも多くの方法があるようです。特定のコードに最適な方法を知りたいです。私は現在、データベースから $card と $bit を取得し、何らかのマッピングを作成して、マップ内の各位置に値を与えています。

Javascript コード:

var jPunten = JSON.parse(data);             
var puntmap = [][];                         
for (var i=0;i<jPunten.length;i++)
{
   puntmap[jPunten[i].CARDNR][jPunten[i].BITNR] = jPunten[i].STATDEV;
}
4

1 に答える 1

5

注:
この回答の最初のセクションでは、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で言えば連想配列)でエラーがスローされます。

于 2013-10-31T13:21:29.020 に答える