2010-11-21 16 views
0

Böyle bir dizi var:JS & jQuery: inArray() ve indexOf() dizinler dizelerdeyse düzgün çalışmıyor mu?

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

ve Im '123' veya '456' bir dizin bulmaya çalışıyor.

ikisi:

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

ve

var string = arr.indexOf('123') 

beni veriyoruz -1. Dizinler dizeler olduğunda çalışmasını sağlamak mümkün mü?

+0

Dizeleriniz, karakterleri dizgeler olarak kullanırken kullanılır. –

cevap

3

Sorun, ilişkisel dizi olarak bir JavaScript dizisi, something that it is not kullanıyor olmanızdır. Bir JavaScript dizisinin indisleri işaretsiz 32 bit tam sayıdır ve bu nedenle * dizeleri kullanamazsınız **. Çok

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

gibi bir dizi kullanmak ya da bir cisim kullanarak, 'A string' ve 'Another string' nesnenin obj özellikleri olduğu bir nesne

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

Not kullanımı ve değerler gibi endeksli edilemez olacaktır ya da bir dizi. Bir nesnenin,, tesisi dize dize olmadıkça başka in anahtar kelime

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

** kullanarak olurdu hasOwnProperty

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

kullanarak olurdu bunlardan biri şekillerde bir dizi sahip olduğunu kontrol edebilirsiniz Tim olarak bir 32 bit işaretsiz tamsayı gösterimi, ama bir çok JavaScript geliştiricisinin netlik için tamsayıları kullanması gerektiğini söyleriz. *

3

Tüm Dizi yöntemleri ve 012 gibiözelliği, Array nesnesinin indexOf yönteminin yalnızca Array'ın sayısal özelliklerini dikkate alır. Bunlar, adları imzasız tamsayı olan özelliklerdir. Belirli bir değere sahip bir özelliğin varlığını test etmek için, diziler dahil olmak üzere herhangi bir nesne üzerinde böyle bir şey yapabilirsiniz. Orada mülkiyet isimlerinin numaralandırma sipariş hakkında garantisi yoktur, bu nedenle belirli bir değere sahip birden fazla özellik varsa o zaman alırsınız hangi özelliği emin olamaz:

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' 

Not tüm özellik adları beri, Sayısal olanlar da dahil olmak üzere dizelere dönüştürülür, dizeleri kullanarak dizi özellikleri atayabilirsiniz:

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

Mükemmel çözüm. Teşekkürler! – sNiCKY