JavaScript dizide


152

Diyelim ki bende:

var blockedTile = new Array("118", "67", "190", "43", "135", "520");

Daha fazla dizi öğesi var, ancak bunlar okunabilirlik için sadece birkaç tane. Neyse, bir "for" döngüsü yapabilirdim ama haritayı her tıkladığınızda 500 döngü yapardı ... belirli bir dizenin bir dizide olup olmadığını görmek için başka bir yolu var mı?

Yanıtlar:


247

Bunu dene:

if(blockedTile.indexOf("118") != -1)
{  
   // element found
}

24
Bu, eski tarayıcılarda çalışmaz (IE <9 gibi). Bunun için bir jQuery işlevi var: api.jquery.com/jQuery.inArray
Vinicius Pinto

5
Daha hızlı bir yol biraz akıllıca çevirmektir, if(!!~blockedTile.indexOf('118))sonuç> -1 ise bu yöntem her zaman true döndürür ve sonuç === -1
bm_i

11
@bm_i Hangisi daha hızlı ? Yazmak daha mı hızlı?
alex

1
indexOf()değişmez dizilere de uygulanabilir, örn if (-1 == [84, 116].indexOf(event.keyCode)). Chrome 37.0.2062.122'de test edildi.
François

2
Her zaman kullanıyorum indexOf(…) >= 0. fark etmez ve nerede bir alışkanlık olarak aldım unutmak
JSDBroughton

49

Daha önce de belirtildiği gibi, tarayıcınız destekliyorsa indexOf()harika! Değilse, pollyfilize etmeniz veya lodash / alt çizgi gibi bir yardımcı kayışa güvenmeniz gerekir .

Bu yeni ES2016 eklentisini eklemek istedim (bu soruyu güncel tutmak için):

Array.prototype.includes ()

if (blockedTile.includes("118")) {
    // found element
}

12
function in_array(needle, haystack){
    var found = 0;
    for (var i=0, len=haystack.length;i<len;i++) {
        if (haystack[i] == needle) return i;
            found++;
    }
    return -1;
}
if(in_array("118",array)!= -1){
//is in array
}

2
OP bir döngü istemedi
JNF

12

Underscore.js kullanın

Bu çapraz tarayıcı uyumlu ve veriler sıralanır eğer bir ikili arama yapabilirsiniz.

_.indeksi

_.indexOf (dizi, değer, [isSorted]) Dizide değerin bulunabileceği dizini veya dizide değer yoksa -1 değerini döndürür. Eksik değilse yerel indexOf işlevini kullanır. Büyük bir dizi ile çalışıyorsanız ve dizinin zaten sıralandığını biliyorsanız, isSorted'ın daha hızlı bir ikili arama kullanması için true değerini iletin.

Misal

//Tell underscore your data is sorted (Binary Search)
if(_.indexOf(['2','3','4','5','6'], '4', true) != -1){
    alert('true');
}else{
    alert('false');   
}

//Unsorted data works to!
if(_.indexOf([2,3,6,9,5], 9) != -1){
    alert('true');
}else{
    alert('false');   
}

11

Bazı tarayıcılar desteklenir Array.indexOf().

Değilse, Arraynesneyi kendi prototipi ile böyle büyütebilirsiniz ...

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(searchElement /*, fromIndex */)
  {
    "use strict";

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (len === 0)
      return -1;

    var n = 0;
    if (arguments.length > 0)
    {
      n = Number(arguments[1]);
      if (n !== n) // shortcut for verifying if it's NaN
        n = 0;
      else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0))
        n = (n > 0 || -1) * Math.floor(Math.abs(n));
    }

    if (n >= len)
      return -1;

    var k = n >= 0
          ? n
          : Math.max(len - Math.abs(n), 0);

    for (; k < len; k++)
    {
      if (k in t && t[k] === searchElement)
        return k;
    }
    return -1;
  };
}

Kaynak .


javascript'te ('118' blokeTile içinde) kullanamaz mıyız?
prabhat mishra

1
@prabhatmishra Bu sadece anahtarları kontrol edebilir.
alex

9

Sadece zevkinize göre kullanın:

var blockedTile = [118, 67, 190, 43, 135, 520];

// includes (js)

if ( blockedTile.includes(118) ){
    console.log('Found with "includes"');
}

// indexOf (js)

if ( blockedTile.indexOf(67) !== -1 ){
    console.log('Found with "indexOf"');
}

// _.indexOf (Underscore library)

if ( _.indexOf(blockedTile, 43, true) ){
    console.log('Found with Underscore library "_.indexOf"');
}

// $.inArray (jQuery library)

if ( $.inArray(190, blockedTile) !== -1 ){
    console.log('Found with jQuery library "$.inArray"');
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


6
if(array.indexOf("67") != -1) // is in array

6

2019'da bunu yapmanın en iyi yolu .includes()

[1, 2, 3].includes(2);     // true
[1, 2, 3].includes(4);     // false
[1, 2, 3].includes(1, 2);  // false

İlk parametre aradığınız şeydir. İkinci parametre, bu dizideki aramanın başlayacağı dizin konumudur.

Burada crossbrowsy olmanız gerekiyorsa - birçok eski cevap var.


1
includesÇözelti olarak kopyalanması durumunda Kutyel (2016), Сергей Савельев (2017) ve Krunal Limbad ... (2018) eşit ayrıntılı örnekler ve referanslarla cevaplar
CPHPython

4

Zaten yukarıda cevaplandı ama paylaşmak istedim.

Ama IE'de çalışmaz. bahsettiğiniz için teşekkürler @Mahmoud

var array1 = [1, 2, 3];

console.log(array1.includes(2));
// expected output: true

var pets = ['cat', 'dog', 'bat'];

console.log(pets.includes('cat'));
// expected output: true

console.log(pets.includes('at'));
// expected output: false

Burada bazı referans var . ayrıca yukarıda için Polyfill var.


Bunu kullanırken dikkatli olun. Array.includes()ES7'de (ECMAScript 2017) tanıtılmaktadır ve eski tarayıcılarla çalışmaz. developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/…
uxcode

3

Kullanabileceğiniz JavaScript sürümüne bağlı olarak şunları kullanabilirsiniz indexOf:

Belirli bir öğenin dizide bulunabileceği ilk dizini veya yoksa -1 değerini döndürür.

Veya some:

Dizideki bazı öğelerin sağlanan işlev tarafından uygulanan testi geçip geçmediğini test eder.

Ancak, bu tür bir varoluş yapıyorsanız, dizelerinizi (veya verilerinizle ne yaptığınıza bağlı olarak belki de bir nesneyi ve Diziyi) depolamak için bir Nesne kullanmanız daha iyi olur.


3

Dizi en iyi çözüm gibi görünmediğinden, farklı bir veri yapısı kullanırdım.

Dizi yerine, bir nesneyi karma tablosu olarak kullanın, şöyle:

( jsbin'de de yayınlanmıştır )

var arr = ["x", "y", "z"];
var map = {};
for (var k=0; k < arr.length; ++k) {
  map[arr[k]] = true;
}

function is_in_map(key) {
  try {
    return map[key] === true;
  } catch (e) {
    return false;
  }
}


function print_check(key) {
  console.log(key + " exists? - " + (is_in_map(key) ? "yes" : "no"));
}

print_check("x");
print_check("a");

Konsol çıkışı:

x exists? - yes
a exists? - no

Bu basit bir çözüm. Nesneye yönelik bir yaklaşımla daha fazla ilgileniyorsanız Google'da "js hashtable" ifadesini arayın .


3

Eski tarayıcılarla en uyumlu IMHO

Array.prototype.inArray = function( needle ){

    return Array(this).join(",").indexOf(needle) >-1;

}

var foods = ["Cheese","Onion","Pickle","Ham"];
test = foods.inArray("Lemon");
console.log( "Lemon is " + (test ? "" : "not ") + "in the list." );

Dizi kopyasını CSV dizesine teslim ederek dizeyi eski tarayıcılarda test edebilirsiniz.


3
dizi üyelerinden herhangi biri iğneyi içeriyorsa, ancak yalnızca bu değilse, bu yanlış pozitif olacaktır. örneğin ['Lemon Pie'].inArray('Lemon')dönecektir True. ,Etrafında dolaşmak için iğneyi sarabilir veya benzer şekilde yapmak için regex eşleşmesini kullanabilirsiniz, ancak ,benzer yanlış pozitif nedenlerden daha belirsiz bir şey kullanarak katılmak tercih edilir ( |örneğin). Veri kümesine bağlıdır
JSDBroughton

1

Neden Array.filter kullanmıyorsunuz?

var array = ['x','y','z'];
array.filter(function(item,index,array){return(item==YOURVAL)}).

Bunu kodunuza kopyalamanız yeterlidir:

Array.prototype.inArray = function (searchedVal) {
return this.filter(function(item,index,array){return(item==searchedVal)}).length==true
}

0

dizi örneğinde, php ile aynı (in_array)

 var ur_fit = ["slim_fit", "tailored", "comfort"];
 var ur_length = ["length_short", "length_regular", "length_high"];
    if(ur_fit.indexOf(data_this)!=-1){
        alert("Value is avail in ur_fit array");
    }
    else if(ur_length.indexOf(data_this)!=-1){      
         alert("value is avail in ur_legth array"); 

    }

0
var myArray = [2,5,6,7,9,6];
myArray.includes(2) // is true
myArray.includes(14) // is false

4
Bir kod parçası göndermek bir cevap DEĞİLDİR , bunun üzerine açıklamalar eklemelisiniz.
xoxel

1
Bu kod snippet'i sorunu çözebilir, ancak soruyu neden veya nasıl yanıtladığını açıklamaz. Lütfen gönderinizin kalitesini artırmaya gerçekten yardımcı olduğu için kodunuz için bir açıklama ekleyin. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın. İşaretçiler / yorumcular: Bunun gibi yalnızca kod yanıtları için, aşağı oy, silmeyin!
Luca Kiebel

Kullanmayı öneren birkaç cevap zaten var includes. Bu cevap kendilerine kıyasla nasıl ek değerler sağlar?
Boghyon Hoffmann

0

Aşağıdaki kodu deneyebilirsiniz. Http://api.jquery.com/jquery.grep/ adresini kontrol edin

var blockedTile = new Array("118", "67", "190", "43", "135", "520");
var searchNumber = "11878";
arr = jQuery.grep(blockedTile, function( i ) {
  return i === searchNumber;
});
if(arr.length){ console.log('Present'); }else{ console.log('Not Present'); }

0'dan büyükse arr.length öğesini kontrol edin dize var demektir, yoksa mevcut değildir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.