web-dev-qa-db-ja.com

JavaScript:連想配列のキーとして整数を使用していますか?

新しいjavascript配列を作成し、整数をキーとして使用すると、その配列の整数までの各要素は未定義として作成されます。例えば:

var test = new Array();
test[2300] = 'Some string';
console.log(test);

2298個の未定義と1つの「一部の文字列」を出力します。

Javascriptで整数ではなく文字列として2300を使用するにはどうすればよいですか、または2299の空のインデックスをインスタンス化しないようにするにはどうすればよいですか?

88
user243540

人々が言っ​​ているように、オブジェクトを使用してください。ただし、整数キーをnot持つことができることに注意してください。 JavaScriptは整数を文字列に変換します。次の出力20、未定義ではありません:

var test = {}
test[2300] = 20;
console.log(test["2300"]);
121
Claudiu

オブジェクトを使用するだけです:

var test = {}
test[2300] = 'Some string';
33
Annie

Javascriptは数値の文字列を整数に変換するので、連想配列で直接使用することはできませんが、オブジェクトは私と同じように機能しますと言われています。

オブジェクトを作成できます:

var object = {};

配列が機能するように値を追加します。

object[1] = value;
object[2] = value;

これはあなたに与えます:

{
  '1':value,
  '2':value
}

その後、キーを取得する他の言語の配列のようにアクセスできます:

for(key in object)
{
   value = object[key] ;
}

これが役立つことを願っています!私はテストして動作しました。

21
Jesuslg123

ユースケースがコレクションにデータを保存している場合、ES6Mapタイプを提供します。

初期化するのは重いだけです。

以下に例を示します。

const map = new Map();
map.set(1, "One");
map.set(2, "Two");
map.set(3, "Three");

console.log("=== With Map ===");

for (const [key, value] of map) {
    console.log(`${key}: ${value} (${typeof(key)})`);
}

console.log("=== With Object ===");

const fakeMap = {
    1: "One",
    2: "Two",
    3: "Three"
};

for (const key in fakeMap) {
    console.log(`${key}: ${fakeMap[key]} (${typeof(key)})`);
}

結果:

=== With Map ===
1: One (number)
2: Two (number)
3: Three (number)
=== With Object ===
1: One (string)
2: Two (string)
3: Three (string)
11
Pragmateek

他の回答のコンパイル:

対象

var test = {};

新しいプロパティのキーとして数値を使用すると、数値は文字列に変わります。

test[2300] = 'Some string';
console.log(test['2300']);
// Output: 'Some string'

同じ番号を使用してプロパティの値にアクセスすると、番号は再び文字列に変換されます。

console.log(test[2300]);
// Output: 'Some string'

ただし、オブジェクトからキーを取得する場合、それらは数値に戻されません。

for (var key in test) {
    console.log(typeof key);
}
// Output: 'string'

地図

ES6では、Mapオブジェクト( documentationObjectとの比較 )を使用できます。コードがローカルで解釈されることを意図している場合、または ES6互換性テーブル が目的に対して十分に緑色に見える場合は、マップの使用を検討してください。

var test = new Map();
test.set(2300, 'Some string');
console.log(test.get(2300));
// Output: 'Some string'

良くも悪くも、型変換は実行されません。

console.log(test.get('2300'));
// Output: undefined
test.set('2300', 'Very different string');
console.log(test.get(2300));
// Output: 'Some string'
7
wordbug

配列ではなくオブジェクトを使用してみてください。

var test = new Object(); test[2300] = 'Some string';
3

プロパティ名が整数の場合、連想配列プロパティの値を取得します。

プロパティ名が整数である連想配列から始めます。

var categories = [
    {"1":"Category 1"},
    {"2":"Category 2"},
    {"3":"Category 3"},
    {"4":"Category 4"}
];

配列にアイテムをプッシュします。

categories.Push({"2300": "Category 2300"});
categories.Push({"2301": "Category 2301"});

配列をループし、プロパティ値で何かをします。

for (var i = 0; i < categories.length; i++) {
    for (var categoryid in categories[i]) {
        var category = categories[i][categoryid];
        // log progress to the console
        console.log(categoryid + " : " + category);
        //  ... do something
    }
}

コンソール出力は次のようになります。

1 : Category 1
2 : Category 2
3 : Category 3
4 : Category 4
2300 : Category 2300
2301 : Category 2301

ご覧のとおり、連想配列の制限を回避して、プロパティ名を整数にすることができます。

注:私の例の連想配列は、Dictionary <string、string> []オブジェクトをシリアル化した場合のJSONです。

2
Jason Williams

配列の代わりにオブジェクトを使用します。 JavaScriptの配列は連想配列ではありません。これらは、名前が整数のように見えるプロパティに関連付けられた魔法を持つオブジェクトです。従来の配列のような構造としてそれらを使用していない場合、その魔法はあなたが望むものではありません。

var test = {};
test[2300] = 'some string';
console.log(test);
2
bdukes

時々、キーにプレフィックスを使用します。例えば:

var pre = 'foo',
       key = pre + 1234
       obj = {};

obj[ key ] = val;

これで、問題なくアクセスできるようになりました。

1
pictus

配列ではなく、オブジェクトをキーとして整数を使用します。

0
Upperstage