2012-02-14 24 views
22
var associativeArray = []; 

associativeArray['key1'] = 'value1'; 
associativeArray['key2'] = 'value2'; 
associativeArray['key3'] = 'value3'; 
associativeArray['key4'] = 'value4'; 
associativeArray['key5'] = 'value5'; 

var key = null; 
for(key in associativeArray) 
{ 
    console.log("associativeArray[" + key + "]: " + associativeArray[key]);   
} 

key = 'key3'; 

var obj = associativeArray[key];   

// gives index = -1 in both cases why? 
var index = associativeArray.indexOf(obj); 
// var index = associativeArray.indexOf(key); 

console.log("obj: " + obj + ", index: " + index); 

上記のプログラムはインデックス-1を表示します。なぜですか?ループを使用せずに連想配列のオブジェクトのインデックスを取得するには、より良い方法はありますか?javascript:連想配列のオブジェクトのインデックスを取得するには?

この配列から 'key3'を削除するとどうなりますか?スプライス関数は、整数でなければならないインデックスとして第1のパラメータをとる。

+8

javascriptには連想配列はありません。 – Sarfraz

+0

可能な複製[JavaScriptオブジェクトでは、値の属性を取得するにはどうすればよいですか?](http://stackoverflow.com/questions/9052888/in-a-javascript-object-whats-best-way-to -get-the-value-of-value) – user123444555621

+0

http://andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/ –

答えて

34

indexOfは、純粋なJavascript配列、つまり整数インデックスを持つ配列でのみ動作します。あなたの「アレイ」は、実際にはオブジェクトであり、オブジェクトのためのindexOfを内蔵、それを書くのは簡単だ決してありませんように

var associativeArray = {} 

として宣言する必要があります。 (最新のブラウザを想定)ループなし

var associativeArray = {} 

associativeArray['key1'] = 'value1'; 
associativeArray['key2'] = 'value2'; 
associativeArray['key3'] = 'value3'; 
associativeArray['key4'] = 'value4'; 
associativeArray['key5'] = 'value5'; 

var value = 'value3'; 
for(var key in associativeArray) 
{ 
    if(associativeArray[key]==value) 
     console.log(key); 
} 

foundKeys = Object.keys(associativeArray).filter(function(key) { 
    return associativeArray[key] == value; 
}) 

指定された値を含むキーの配列を返します。あなたはjQueryのを使用しない場合、あなたはこれを行うオブジェクトのプロトタイプを拡張することができ

+1

「key3」をこのから削除するとどうなりますかアレイ?スプライス関数は、整数でなければならないインデックスとして第1のパラメータをとる。 – gmuhammad

+2

@gmuhammad 'splice()'メソッドは、オブジェクトではなく配列に対してのみ動作します。たとえば、delete associativeArray ['key3'] 'を使ってプロパティを削除する必要があります。 – GregL

+3

thg435:変数名に「array」という単語を使用すると、多分混乱が生じました。おそらく 'associativeMap'は配列ではなくオブジェクトであることを明確にする方がいいでしょうか? – GregL

2

:あなたはそれを使用する場合

// Returns the index of the value if it exists, or undefined if not 
Object.defineProperty(Object.prototype, "associativeIndexOf", { 
    value: function(value) { 
     for (var key in this) if (this[key] == value) return key; 
     return undefined; 
    } 
}); 

代わりに共通Object.prototype.associativeIndexOf = ...のこの方法を使用するには、jQueryを使って動作します。

そして、あなたはこのようにそれを使用することができます。

var myArray = {...}; 
var index = myArray.associativeIndexOf(value); 

また、通常の配列で動作します:[...]、あなたも代わりindexOfのそれを使用することができるように。

それは未定義だかどうかを確認するために、三重文字の演算子を使用することを忘れないでください:もちろん

index === undefined // to check the value/index exists  
index !== undefined // to check the value/index does not exist 

をあなたが例keyOfのために好む場合、関数の名前を変更し、任意の変数を宣言しないように覚えることができます「未定義」と呼ばれます。

関連する問題