JavaScript jest w tablicy

152

Powiedzmy, że mam to:

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

Jest więcej elementów tablicy, ale to tylko kilka ze względu na czytelność. Tak czy inaczej, mógłbym zrobić pętlę „for”, ale wykonałoby to 500 pętli za każdym razem, gdy klikniesz mapę ... czy istnieje inny sposób sprawdzenia, czy określony ciąg znajduje się w tablicy?

test
źródło

Odpowiedzi:

247

Spróbuj tego:

if(blockedTile.indexOf("118") != -1)
{  
   // element found
}
Bala R
źródło
24
To nie działa w przypadku starszych przeglądarek (np. IE <9). Jest do tego funkcja jQuery: api.jquery.com/jQuery.inArray
Vinicius Pinto
5
Szybszym sposobem jest odwrócenie bitów mądrze, if(!!~blockedTile.indexOf('118))ta metoda zawsze zwróci true, jeśli wynik> -1 i false, jeśli wynik === -1
bm_i
11
@bm_i Który szybciej ? Szybsze pisanie?
Alex
1
indexOf()można również zastosować do tablic dosłownych, np if (-1 == [84, 116].indexOf(event.keyCode)). Przetestowano w przeglądarce Chrome 37.0.2062.122.
François
2
fwiw zawsze używam indexOf(…) >= 0. nie robi różnicy i zapominam, skąd
wziąłem
49

Jak wspomniano wcześniej, jeśli Twoja przeglądarka obsługuje indexOf(), świetnie! Jeśli nie, musisz go pollyfil lub polegać na pasku narzędziowym, takim jak lodash / underscore .

Chciałem tylko dodać ten nowszy dodatek ES2016 (aby zaktualizować to pytanie):

Array.prototype.includes ()

if (blockedTile.includes("118")) {
    // found element
}
Kutyel
źródło
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
}
ndhanhse
źródło
2
OP nie chciał pętli
JNF
12

Użyj Underscore.js

Jest zgodny z różnymi przeglądarkami i może przeprowadzać wyszukiwanie binarne, jeśli dane są posortowane.

_.indeks

_.indexOf (tablica, wartość, [posortowany]) Zwraca indeks, przy którym wartość można znaleźć w tablicy lub -1, jeśli wartość nie jest obecna w tablicy. Używa natywnej funkcji indexOf, chyba że jej brakuje. Jeśli pracujesz z dużą tablicą i wiesz, że tablica jest już posortowana, przekaż wartość true dla isSorted, aby użyć szybszego wyszukiwania binarnego.

Przykład

//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');   
}
Brandon Boone
źródło
11

Niektóre przeglądarki obsługują Array.indexOf().

Jeśli nie, możesz ulepszyć Arrayobiekt za pomocą jego prototypu w ten sposób ...

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;
  };
}

Źródło .

Alex
źródło
czy nie możemy użyć ('118' w BlockedTile) w javascript?
prabhat mishra
1
@prabhatmishra To może sprawdzać tylko klucze.
Alex
9

Po prostu użyj według własnego gustu:

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>

Сергей Савельев
źródło
6
if(array.indexOf("67") != -1) // is in array
Marty
źródło
6

Najlepszym sposobem na to w 2019 roku jest użycie .includes()

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

Pierwszy parametr to to, czego szukasz. Drugi parametr to pozycja indeksu w tej tablicy, od której należy rozpocząć wyszukiwanie.

Jeśli musisz być tutaj crossbrowsy - istnieje wiele starszych odpowiedzi.

Alex Under
źródło
1
includesRozwiązanie jest powielany w Kutyel (2016), Сергей Савельев (2017) i Krunal Limbad (2018) odpowiedzi z równie szczegółowe przykłady i odniesienia ...
CPHPython
4

Odpowiedziałem już powyżej, ale chciałem się podzielić.

Jednak nie będzie działać w IE. dzięki za wspomnienie o tym @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

Mam tutaj odniesienie . mają również Polyfill powyżej.

Krunal Limbad
źródło
Uważaj, kiedy tego używasz. Array.includes()jest wprowadzona w ES7 (ECMAScript 2017) i nie będzie działać ze starymi przeglądarkami. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ...
uxcode
3

W zależności od dostępnej wersji JavaScript możesz użyć indexOf:

Zwraca pierwszy indeks, w którym dany element można znaleźć w tablicy lub -1, jeśli go nie ma.

Lub some:

Sprawdza, czy jakiś element w tablicy przechodzi test zaimplementowany przez podaną funkcję.

Ale jeśli robisz tego rodzaju istnienie, sprawdzaj dużo, lepiej byłoby użyć Object do przechowywania twoich ciągów (lub być może obiektu, a także tablicy, w zależności od tego, co robisz ze swoimi danymi).

mu jest za krótkie
źródło
3

Użyłbym innej struktury danych, ponieważ tablica wydaje się nie być najlepszym rozwiązaniem.

Zamiast tablicy użyj obiektu jako tablicy skrótów, na przykład:

(opublikowane również w jsbin )

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");

Wyjście konsoli:

x exists? - yes
a exists? - no

To proste rozwiązanie. Jeśli bardziej interesuje Cię podejście obiektowe, wyszukaj w Google „js hashtable” .

Ron Klein
źródło
3

IMHO najbardziej kompatybilny ze starszymi przeglądarkami

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." );

Zamieniając kopię Array w ciąg CSV, możesz przetestować ciąg w starszych przeglądarkach.

Mark Giblin
źródło
3
będzie to fałszywie dodatnie, jeśli którykolwiek z elementów tablicy zawierał igłę, ale nie był nią wyłącznie. np . ['Lemon Pie'].inArray('Lemon')wróci True. Możesz owinąć igłę, ,aby ominąć ją, lub użyć dopasowania wyrażeń regularnych, aby zrobić podobnie, ale łączenie byłoby lepsze przy użyciu czegoś bardziej niejasnego niż ,z podobnych powodów fałszywie dodatnich ( |powiedzmy). To zależy od zbioru danych
JSDBroughton
1

Dlaczego nie używasz Array.filter?

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

Po prostu skopiuj to do swojego kodu i gotowe:

Array.prototype.inArray = function (searchedVal) {
return this.filter(function(item,index,array){return(item==searchedVal)}).length==true
}
Nikita Yegorov
źródło
0

w przykładzie tablicy, to samo w php (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"); 

    }
Avinash Raut
źródło
0
var myArray = [2,5,6,7,9,6];
myArray.includes(2) // is true
myArray.includes(14) // is false
kaboome
źródło
4
Umieszczenie fragmentu kodu NIE jest odpowiedzią, należy dodać do tego wyjaśnienia.
xoxel
1
Chociaż ten fragment kodu może rozwiązać problem, nie wyjaśnia, dlaczego ani jak odpowiada na pytanie. Dołącz wyjaśnienie swojego kodu , ponieważ naprawdę pomaga to poprawić jakość Twojego postu. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a osoby te mogą nie znać powodów, dla których zaproponowałeś kod. Osoby zgłaszające / recenzujące: w przypadku odpowiedzi zawierających tylko kod, takich jak ta, głosuj przeciw, nie usuwaj!
Luca Kiebel
Istnieje już kilka odpowiedzi sugerujących użycie includes. W jaki sposób ta odpowiedź dostarcza dodatkowych wartości w porównaniu z nimi?
Boghyon Hoffmann
0

Możesz wypróbować poniższy kod. Sprawdź http://api.jquery.com/jquery.grep/

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'); }

sprawdź arr.length, jeśli jest większa niż 0, oznacza, że ​​łańcuch jest obecny, w przeciwnym razie nie jest obecny.

Prasad Wargad
źródło
-2

Myślę, że najprostszy sposób jest taki:

(118 in blockedTile); //is true 
Cristian Mecozzi
źródło