2012-04-16 8 views
5

は、私は、Pythonで簡単な例を持っている:Javascriptで配列をキーとして使用するには?

programs = {} 
if not programs.has_key((program, time)): 
    programs[(program, time)] = 0 
programs[(program, time)] = programs[(program, time)] + 1 

はどのようにJavaScriptでキーとして配列を使用しますか?

+1

配列をハッシュのルックアップとして使用することを意味しますか? – alex

+1

'program'と' time'の取りうる値によっては、 '[program、time]'の文字列表現をキーとして使うだけで問題ないかもしれません。プロパティとして使用する値は自動的に文字列に変換されるため、使い方は簡単です。 –

+0

Robが言ったように、** "program_time" **のようなキーをカスタム化し、自分で処理します。 – tym1193

答えて

3

これはあなたのトリックですか?

jsfiddle

<script> 
var ary = {person1:'valerie', person2:'alex'}; 
for (key in ary) { 
    document.write(key, '<br>') 
} 

document.write(ary['person2'], '<br>') 
</script> 
8

JavaScriptキーは文字列です。

WeakMapまたは配列を他のオブジェクトにマップするカスタムメソッドが必要です。

+3

map.set([1,2]、 'woo'); map.get([1,2]) - >未定義です。その方法で配列を使用する方法はありますか? –

+2

'[1、2]'と '[1,2]'は異なるオブジェクトです。 'var arr = [1、2];' 'map.set(arr、 'woo');' 'map.get(arr、 'woo');'を使用してください。配列への参照を保持できない場合は、何らかの方法で直列化/ハッシュする必要があります。 Naively、例えば。 'arr.join( '、')'をキーとして使用します。 –

+0

ええ、私は奇妙な方法でそれをハッシュアップしてしまった:)それは一瞬に何百万回も起こっているので、私は文字列を使いたくなかった。あまりにも悪い - 配列はいいだろう。 –

16

この意志 "仕事"。

var a = {}; 
var b = [1,2,3];  
a[b] = 'hello'; 

// a[b] evaluates to 'hello' 
// a[[1,2,3]] evaluates to 'hello' 
// a['1,2,3'] evaluates to 'hello' 
あなたはハッシュ(マップ/連想配列)をキーとして、配列[1,2,3]を渡す際に、文字列に変換されているので、それは動作します

'(しかし、私はそれをお勧めしません)ハッシュルックアップを実行する前に1,2,3 '異なるハッシュ値にマップするために同じ値の2つの異なる配列を必要としない限り、ニーズに合っているはずです。

var c = [1,2,3] 
// a[c] evaluates to 'hello' even though we never executed a[c] = 'hello' 
// but b == c evaluates to false 
// b & c are two separate objects with the same values, so when they 
// get converted to a string for hashing, they return the same value from the hash 

これまで説明したように、オブジェクト参照をキーとして使用するには、標準のJavaScriptハッシュ以上のものが必要です。

@speedplaneからのコメントに基づいて

更新

私はJSはあなたがハッシュキーにそれを渡すアレイ上toString()を呼び出すと思われます。だから、簡単にあなたが実際にあなたのキーとして取得するつもりだ何をテストすることができます。

["x", "y", "z"].toString;    // 'x,y,z' 
["x,y,z"].toString();     // 'x,y,z' 
[1,2,3].toString();      // '1,2,3' 
[1,2,'3'].toString();     // '1,2,3' 
[[1],[2],[3]].toString();    // '1,2,3' 
[["x",1], ["y",2], ["z",3]].toString(); // 'x,1,y,2,z,3' 

だからもう一度、私は何が起こっているかを理解し、あなたがあなたでない限り本当にこれをしないことをお勧めします。それでも、私はそれをやりません。

+0

文字列をキーとして使用している場合、これはあまりうまくいかないことに注意してください。たとえば、 'var a = {}; var b = ["x"、 "y"、 "z"]; var c = ["x、y、z"]; a [b] = 'uh oh'; a [c] 'は「ああ」と評価されます。 2つの異なる配列 'b'と' c'は同じオブジェクトキーにマップされます。 – speedplane

+0

@speedplaneそれを指摘してくれてありがとう。あなたの例で私の答えを更新しました。また、私はあなたがこれをすることをお勧めしないと明言しました。 –

関連する問題