web-dev-qa-db-ja.com

Javascript:タプルを辞書キーとして使用

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

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

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

my_map[[a,b]] = c

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

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

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

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

編集:

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

28
hasen

EcmaScriptは、名前によるインデックス作成と[]によるインデックス作成を区別しません。

a.name

文字通りと同等です

a["name"]

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

a.1
a.true

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

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

a[1]

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

a[String(1)]

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

my_map[[a,b]] = c

どちらになる

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

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

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

20
olliej

私の 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] ) );
5
Tim Down

Javascriptのすべてのオブジェクトキーは文字列です。 _my_map[[a,b]] = c_を使用すると、[a,b].toString()a.toString() + ',' + b.toString()の結果である_my_map_にキーが生成されます。これは実際には望ましい場合がありますが(_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 */
};
_
2
eyelidlessness

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

var my_map = [["blah","blah","bla"],
              ["foo", "bla", 8],
              [324, 2345, 235],
              [true, false, "whatever..."]];
0
Zelenova