4

データ項目を使用して、インデックスが整数範囲全体に分散している JavaScript で文字列配列 (サイズ <100 項目) を初期化する方法。

私がこれを好きなら:

array1 = ["string1","string2","string3","string4"];

次に、0 から 3 の範囲のインデックスを持つ長さ 4 の配列を取得します

しかし、私の場合、配列を高性能の int-string ハッシュ テーブルのように使用できるように、独自のインデックスを保持したいと考えています。

私はできれば単一のステートメントの初期化を探しています。

配列の項目は、次のようにアクセスできる必要があります。array1[23454]

コメントから更新

動的に準備された配列初期化文字列が次のようにサーバー側から追加されるため、配列を単一のステートメントとして初期化するように制限されています。var array = <string from server here>

4

4 に答える 4

2

使用できるインデックスのセット数で配列を作成するには

// Creates an array with 12 indexes
var myArray = new Array(12);

これは、配列の動作方法により、javascript では必要ありません。配列の上限はありません。存在しない配列内のアイテム インデックスを参照しようとすると、undefinedが返されますが、エラーはスローされません。

指定されたインデックスを持つ配列を作成するには、次のようなものを使用できますがarray['index'] = value、これにより複数のステートメントを使用する必要があります。Javascriptには、インデックスと値をすべて単一のステートメントで指定できるようにする配列初期化子がありませんが、そのようにする関数を作成できます

function indexArray(param) {
    var a = [], i;
    for (i=0; i<param.length; i+=1) {
        a[param[i].index] = param[i].value;
    }
    return a;
}

var myArray = indexArray([
    { index: 123456, value : "bananas" },
    { index: 12, value : "grapes" },
    { index: 564, value : "monkeys" }
]);
于 2012-10-25T16:13:20.640 に答える
2

配列に割り当てる前に、配列のサイズを事前に定義する必要はありません。例えば:

var _array = [];
    _array[0] = "foo";
    _array[1000] = "bar"; // _array.length => 1001 

_array[1] //undefined

割り当てる前に適切な数の配列要素を初期化する必要はありません。

アップデート

配列ではなくオブジェクトを使用できることはすでに指摘されています。ただし、配列メソッドを利用したい場合は、これも可能です。例を挙げましょう:

var obj = {
    0: 15,
    1: 10,
    2: 5,
    length: 3
};

オブジェクトに長さプロパティが含まれている場合は、配列のようなオブジェクトとして扱うことができます。これらのオブジェクトから配列メソッドを直接呼び出すことはできませんが、配列メソッドを使用できます。

Array.prototype.join.call( obj ); // 15,10,5

実際、ECMAScript 5 map 関数を使用すると、上記のオブジェクトを配列に簡単に変換できます。

var _array = Array.prototype.map.call( obj, function( x ) { return x; } );

マップ機能はすべてのブラウザに存在するわけではありませんが、存在しない場合は次の機能を使用できます。

Array.map = Array.map || function(a, f, thisArg) {
    return Array.prototype.map.call(a, f, thisArg); 
}
于 2012-10-25T16:27:34.300 に答える
2
var array1 = []
array1[23454] = 2

これをするだけでいいはずです。Java の場合のように、javascript には設定された配列サイズはありません。

本当にこれをすべて単一のステートメントで実行したい場合は、代わりに次のようにオブジェクトを作成できます。

var object1 = {
    "23454":2,
    "123":1,
    "50":3
};

次に、次のように数値を取得します。

object1["23454"]  //2

ただし、これはあまりお勧めしません。配列メソッドは、文字列変換を必要としないため、複数行かかる場合でもよりクリーンな方法です。これらがブラウザーにどのように実装されているかについては、パフォーマンスへの影響についてコメントするのに十分な知識がありません。

アップデート

1 行の要件はサーバーに渡されるものに基づいているため、JSON オブジェクトを次の形式でサーバーに渡すことをお勧めします。

"{"23454":2,"123":1,"50":3}"

次に、このコードはそれをオブジェクトに解析します。

var object1 = JSON.parse(jsonstringfromserver);

また、必要に応じて、for in ループでプロパティを列挙することにより、いつでも配列に変換できます。

var array1 = []
for ( num in object1){
    array1[num] = object1[num];

object1[123] はすでに 1 を返すため、これはおそらく不要です。これは、配列固有の操作を行う予定がある場合にのみ必要です。

于 2012-10-25T16:20:30.153 に答える
0

この方法でオブジェクトを使ってやりたいことができます:

var o = {23454: 'aaaa', 23473: 'bbb'};

長さなどの配列メソッド/フィールドは失われますが、探していると言ったものが得られ、メンバーを簡単に追加/削除できるようになります。

于 2012-10-25T16:30:22.057 に答える