34

タプルから整数へのマッピングを作成したいという状況があります。(a,b)Pythonでは、辞書のキーとしてタプルを使用するだけです。

Javascriptにはタプルがありますか?(a,b)javascriptでは、式としてb(最後の項目)を返すだけであることがわかりました。どうやらこれはCから継承されています。

したがって、回避策として、代わりに配列を使用できると思いました。

my_map[[a,b]] = c

Firebugコンソールで試してみましたが、動作しているようです。それはそれを行うための良い方法ですか?

私が考えたもう1つの方法は、タプルから文字列を作成することです。

my_map[""+a+":"+b] = c

したがって、問題は次のとおりです。これらの方法のいずれかに問題はありますか?もっと良い方法はありますか?

編集:

簡単な説明:私の場合、a、b、cはすべて整数です

4

4 に答える 4

23

EcmaScriptは、名前によるプロパティのインデックス作成と、たとえば、プロパティのインデックス作成を区別しません[]

a.name

文字通りと同等です

a["name"]

唯一の違いは、番号などは名前付きプロパティアクセスでは有効な構文ではないということです

a.1
a.true

などはすべて無効な構文です。

残念ながら、これらのインデックス作成メカニズムがすべて同じである理由は、EcmaScriptではすべてのプロパティ名が文字列であるためです。例えば。

a[1]

効果的に次のように解釈されます

a[String(1)]

つまり、あなたの例では次のことを行います。

my_map[[a,b]] = c

になります

my_map[String([a,b])] = c

これは、2番目の例が行っていることと本質的に同じです(ただし、実装によっては、より高速になる場合があります)。

真の値に関連付けられたルックアップが必要な場合は、js言語の上に自分で実装する必要があり、[]スタイルの優れたアクセスが失われます:-(

于 2009-09-15T05:13:06.577 に答える
7

私のjshashtableを使用してから、任意のオブジェクトをキーとして使用できますが、タプルが整数の配列であると仮定すると、最善の策は自分で言及したものだと思います。Arrayのjoin()メソッドを使用して、通常のオブジェクトのプロパティ名を作成します。これを非常に簡単にラップできます。

function TupleDictionary() {
 this.dict = {};
}

TupleDictionary.prototype = {
 tupleToString: function(tuple) {
  return tuple.join(",");
 },

 put: function(tuple, val) {
  this.dict[ this.tupleToString(tuple) ] = val;
 },

 get: function(tuple) {
  return this.dict[ this.tupleToString(tuple) ];
 }
};

var dict = new TupleDictionary();
dict.put( [1,2], "banana" );
alert( dict.get( [1,2] ) );
于 2009-09-15T09:00:35.620 に答える
4

Javascriptのすべてのオブジェクトキーは文字列です。を使用すると、次の結果であるmy_map[[a,b]] = cキーが生成されます。これは実際には望ましい場合がありますが(使用方法と同様)、キーに区切り文字(配列をキーとして使用する場合はコンマ、文字列を次のように記述する場合はコロン)が含まれていると、競合が発生する可能性があります。あなたの例にあります)。my_map[a,b].toString()a.toString() + ',' + b.toString()a + ':' + b

編集:別のアプローチは、キー参照用に別の配列を保持することです。例えば:

var keys = [
    [a,b],
    [c,d]
];
var my_map = {
    'keys[0]': /* Whatever [a,b] ought to be the key for */,
    'keys[1]': /* Whatever [c,d] ought to be the key for */
};
于 2009-09-15T05:17:23.870 に答える
0

同様のことを実現するための最も単純で「自然な」方法は、次のような多次元配列を使用することです。

var my_map = [["blah","blah","bla"],
              ["foo", "bla", 8],
              [324, 2345, 235],
              [true, false, "whatever..."]];
于 2012-02-04T23:29:33.620 に答える