2010-11-21 7 views
0

私はこのような配列があります:「123」や「456」のインデックスを検索しようとJS&jQuery:インデックスが文字列の場合、inArray()とindexOf()は正しく機能していませんか?

var arr = []; 
arr['A string'] = '123'; 
arr['Another string'] = '456'; 

とイムを。

両方:

var string = $.inArray('123', arr) 

var string = arr.indexOf('123') 

は私に与えている-1。インデックスが文字列の場合は、それを動作させることは可能ですか?

+0

文字列をインデックスとして使用する場合、配列はオブジェクトです。 –

答えて

3

問題は、JavaScript配列を連想配列のsomething that it is notとして使用していることです。 JavaScript配列のインデックスは符号なし32ビット整数であるため、*文字列**は使用できません。あなたがオブジェクトを使用して、'A string''Another string'オブジェクトobjの特性であるとの値のようにインデックス付けすることができないので

// I'm guessing that you meant to give numerical and not string values 
var arr = [123, 456]; 

又は

var obj = { 
    'A string' : 123, 
    'Another string' : 456 
}; 

オブジェクトを使用するノートのようなアレイを使用するいずれか配列。あなたは、オブジェクトが文字列が文字列でない限りhasOwnProperty

if (obj.hasOwnProperty('A string')) { 
    // if obj has property 'A string' as a direct property 
} 

別のを使用することになりそのうちの一つ、いくつかの方法は、** inキーワード

if ('A string' in obj) { 
    // if obj has a property 'A string' as a property (could be an inherited property too) 
} 

を使用してしまう性質を持っていることを確認することができます32ビットの符号なし整数の表現はTimだが、JavaScriptの開発者の多くは、整数を使用して明快にすることに固執すると言っても過言ではないと思う。*

3

同様にすべての配列メソッドとlengthプロパティの場合、ArrayオブジェクトのindexOfメソッドは配列の数値プロパティのみを考慮します。これらは名前が符号なし整数であるプロパティです。特定の値を持つプロパティの存在をテストするには、配列を含むあらゆるオブジェクトでこれを行うことができます。特定の値を持つ複数のプロパティがありますならば、あなたが買ってあげるどのプロパティを確認することはできませんので、プロパティ名の列挙順序についての保証は、ありません:

function findPropertyWithValue(obj, val) { 
    for (var i in obj) { 
     if (obj.hasOwnProperty(i) && obj[i] === val) { 
      return i; 
     } 
    } 
    return null; 
} 

var arr = []; 
arr['A string'] = '123'; 
arr['Another string'] = '456'; 
alert(findPropertyWithValue(arr, "123")); // 'A string' 

注意すべてのプロパティ名以来という、文字列を使用して配列プロパティを割り当てることができます。

var arr = []; 
arr["1"] = "foo"; 
arr[3] = "bar" 
arr.indexOf("foo"); // 1 
arr.indexOf("bar"); // 3 
+0

完璧なソリューション。ありがとう! – sNiCKY

関連する問題