Bir diziden değerleri karşılaştırmak ve başka bir dizide olup olmadığını görmek için JavaScript bir yolu var mı?
PHP'nin in_array
a> işlevine benzer?
Bir diziden değerleri karşılaştırmak ve başka bir dizide olup olmadığını görmek için JavaScript bir yolu var mı?
PHP'nin in_array
a> işlevine benzer?
Hayır, bir tane yok. Bu nedenle en popüler kütüphaneler kendi programı paketlerinde biri ile gelir. Örnekler için jQuery 'inArray and Prototype's Array.indexOf em> göz atın.
bunun jQuery uygulamasıdır Tahmin edebileceğiniz gibi basittir:
function inArray(needle, haystack) {
var length = haystack.length;
for(var i = 0; i < length; i++) {
if(haystack[i] == needle) return true;
}
return false;
}
Eğer dizi elemanlarının aklı başında bir miktarı ile ilgili ise yukarıdaki güzel hile yapacak.
EDIT: Whoops. Ben bile bir dizi başka içeride olup olmadığını görmek istedim fark etmedi. PHP belgelerine göre bu PHP'nin beklenen davranıştır in_array
a>:
$a = array(array('p', 'h'), array('p', 'r'), 'o');
if (in_array(array('p', 'h'), $a)) {
echo "'ph' was found\n";
}
if (in_array(array('f', 'i'), $a)) {
echo "'fi' was found\n";
}
if (in_array('o', $a)) {
echo "'o' was found\n";
}
// Output:
// 'ph' was found
// 'o' was found
Chris ve Alex tarafından yayınlanmıştır kodu bu davranışı takip etmez. Alex'in Prototype'ın indexOf resmi versiyonu, ve Chris en fazla PHP'nin array_intersect
a> gibi. Bu ne istediğinizi yapar:
function arrayCompare(a1, a2) {
if (a1.length != a2.length) return false;
var length = a2.length;
for (var i = 0; i < length; i++) {
if (a1[i] !== a2[i]) return false;
}
return true;
}
function inArray(needle, haystack) {
var length = haystack.length;
for(var i = 0; i < length; i++) {
if(typeof haystack[i] == 'object') {
if(arrayCompare(haystack[i], needle)) return true;
} else {
if(haystack[i] == needle) return true;
}
}
return false;
}
Ve bu üzerinde yukarıda benim test:
var a = [['p','h'],['p','r'],'o'];
if(inArray(['p','h'], a)) {
alert('ph was found');
}
if(inArray(['f','i'], a)) {
alert('fi was found');
}
if(inArray('o', a)) {
alert('o was found');
}
// Results:
// alerts 'ph' was found
// alerts 'o' was found
Genellikle bunu yapmak için kötü bir fikir olduğu gibi kasıtlı Dizi prototip uzatmak vermedi unutmayın.
Array.indexOf
was introduced in JavaScript 1.6, but it is not supported in older browsers. Thankfully the chaps over at Mozilla have done all the hard work sizin için, ve uyumluluk için bu ile sağlanan:
if (!Array.prototype.indexOf)
{
Array.prototype.indexOf = function(elt /*, from*/)
{
var len = this.length >>> 0;
var from = Number(arguments[1]) || 0;
from = (from < 0)
? Math.ceil(from)
: Math.floor(from);
if (from < 0)
from += len;
for (; from < len; from++)
{
if (from in this &&
this[from] === elt)
return from;
}
return -1;
};
}
Komut dosyası zevk için bazı kullanışlı kullanım parçacıkları bile vardır.
Endeksleri sırayla değildir, ya da dizinleri ardışık değilseniz, burada listelenen diğer çözümlerde kod kıracak eğer. Biraz daha iyi çalışacak bir çözüm olabilir:
function in_array(needle, haystack) {
for(var i in haystack) {
if(haystack[i] == needle) return true;
}
return false;
}
Ve, bir bonus olarak, burada dizideki elemanın anahtarını bulmak için (PHP'nin array_search için eşdeğerdir:
function array_search(needle, haystack) {
for(var i in haystack) {
if(haystack[i] == needle) return i;
}
return false;
}
Adında bir proje var PHPJS. Bu JavaScript PHP fonksiyonları uygulayan ve in_array() fonksiyonu var. PHP kullanmak gibi veri türlerini denetler üçüncü argüman da dahil olmak üzere, tam olarak kullanabilirsiniz.
Kullanım iki örnek:
in_array('van', myArray);
in_array(1, otherArray, true);
Eğer yalnızca tek bir değer, bir dizide olup olmadığını kontrol etmek istiyorsanız, o zaman Paolo kod işini yapacak. Eğer değerler her iki dizide ortak olduğunu kontrol etmek istiyorsanız, o zaman (Paolo'nun inarray işlevini kullanarak) böyle bir şey isteyeceksiniz:
function arrayIntersect(a, b) {
var intersection = [];
for(var i = 0; i < a.length; i++) {
if(inArray(b, a[i]))
intersection.push(a[i]);
}
return intersection;
}
Bu, her iki a
ve b
olan değerler bir dizi döndürür wil. (Matematiksel olarak, bu, bir intersection, iki dizilerin içindir.)
EDIT: sorununuza çözüm için Paolo's Edited Code bakın. :)
Dojo Toolkit, kullanacağınız ile dojo.indexOf()
. Bazı örnekler için Bryan Forbes tarafından dojo.indexOf for the documentation, and Arrays Made Easy em> bakın.
Tüm PHP mevcut parametreler gerekiyorsa, bu kullanın:
function in_array(needle, haystack, argStrict) {
var key = '', strict = !!argStrict;
if (strict) {
for (key in haystack) {
if (haystack[key] === needle) {
return true;
}
}
}
else {
for (key in haystack) {
if (haystack[key] == needle) {
return true;
}
}
}
return false;
}
Sen underscore.js ile yapabilirsiniz.
Ben büyük bir jQuery çözüm here SO bulundu.
var success = $.grep(array_a, function(v,i) {
return $.inArray(v, array_b) !== -1;
}).length === array_a.length;
Birisi çizgi bu nasıl bir örnek göndermek isterdim.