JavaScript ist im Array

152

Nehmen wir an, ich habe Folgendes:

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

Es gibt mehr Array-Elemente, aber diese sind aus Gründen der Lesbarkeit nur wenige. Wie auch immer, ich könnte eine "for" -Schleife ausführen, aber jedes Mal, wenn Sie auf die Karte klicken, werden 500 Schleifen ausgeführt. Gibt es eine andere Möglichkeit, um festzustellen, ob sich eine bestimmte Zeichenfolge in einem Array befindet?

Prüfung
quelle

Antworten:

247

Versuche dies:

if(blockedTile.indexOf("118") != -1)
{  
   // element found
}
Bala R.
quelle
24
Dies funktioniert nicht für alte Browser (wie IE <9). Es gibt eine jQuery-Funktion dafür: api.jquery.com/jQuery.inArray
Vinicius Pinto
4
Eine schnellere Möglichkeit besteht darin, das Bit weise if(!!~blockedTile.indexOf('118))umzudrehen. Diese Methode gibt immer true zurück, wenn das Ergebnis> -1 ist, und false, wenn result === -1
bm_i
10
@bm_i Welche schneller ? Schneller zu tippen?
alex
1
indexOf()kann auch auf Literal-Arrays angewendet werden, z if (-1 == [84, 116].indexOf(event.keyCode)). Getestet auf Chrome 37.0.2062.122.
François
2
fwiw benutze ich immer indexOf(…) >= 0. macht keinen Unterschied und ich vergesse, wo ich es als Gewohnheit aufgenommen habe
JSDBroughton
49

Wie bereits erwähnt, wenn Ihr Browser unterstützt indexOf(), großartig! Wenn nicht, müssen Sie es pollyfil oder auf einen Gebrauchsgürtel wie lodash / Unterstrich verlassen .

Ich wollte nur diesen neueren ES2016- Zusatz hinzufügen (um diese Frage auf dem neuesten Stand zu halten):

Array.prototype.includes ()

if (blockedTile.includes("118")) {
    // found element
}
Kutyel
quelle
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
quelle
2
OP wollte keine Schleife
JNF
12

Verwenden Sie Underscore.js

Es ist browserübergreifend kompatibel und kann eine binäre Suche durchführen, wenn Ihre Daten sortiert sind.

_.Index von

_.indexOf (Array, Wert, [isSorted]) Gibt den Index zurück, bei dem der Wert im Array gefunden werden kann, oder -1, wenn der Wert im Array nicht vorhanden ist. Verwendet die native indexOf-Funktion, sofern sie nicht fehlt. Wenn Sie mit einem großen Array arbeiten und wissen, dass das Array bereits sortiert ist, übergeben Sie true für isSorted, um eine schnellere binäre Suche zu verwenden.

Beispiel

//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
quelle
11

Einige Browser unterstützen Array.indexOf() .

Wenn nicht, können Sie das ArrayObjekt über seinen Prototyp wie folgt erweitern ...

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

Quelle .

Alex
quelle
können wir ('118' in blockedTile) nicht in Javascript verwenden?
Prabhat Mishra
1
@prabhatmishra Das kann nur nach Schlüsseln suchen.
Alex
9

Verwenden Sie einfach für Ihren Geschmack:

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>

Сергей Савельев
quelle
6
if(array.indexOf("67") != -1) // is in array
Marty
quelle
6

Der beste Weg, dies im Jahr 2019 zu tun, ist die Verwendung von .includes()

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

Der erste Parameter ist das, wonach Sie suchen. Der zweite Parameter ist die Indexposition in diesem Array, an der mit der Suche begonnen werden soll.

Wenn Sie hier böse sein müssen, gibt es viele alte Antworten.

Alex Under
quelle
1
Die includesLösung ist in den Antworten von Kutyel (2016), Сергей Савельев (2017) und Krunal Limbad (2018) mit ebenso detaillierten Beispielen und Referenzen
dupliziert
4

Bereits oben beantwortet, wollte aber teilen.

Funktioniert allerdings nicht im IE. Danke, dass du es @Mahmoud erwähnt hast

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

bekommt einen Hinweis hier . Sie haben auch Polyfill für oben.

Krunal Limbad
quelle
Seien Sie vorsichtig, wenn Sie dies verwenden. Array.includes()wird in ES7 (ECMAScript 2017) eingeführt und funktioniert nicht mit alten Browsern. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
uxcode
3

Abhängig von der verfügbaren JavaScript-Version können Sie Folgendes verwenden indexOf:

Gibt den ersten Index zurück, an dem ein bestimmtes Element im Array gefunden werden kann, oder -1, wenn es nicht vorhanden ist.

Oder some:

Testet, ob ein Element im Array den von der bereitgestellten Funktion implementierten Test besteht.

Wenn Sie diese Art von Existenzprüfung durchführen, ist es jedoch besser, ein Objekt zum Speichern Ihrer Zeichenfolgen zu verwenden (oder möglicherweise ein Objekt sowie das Array, je nachdem, was Sie mit Ihren Daten tun).

mu ist zu kurz
quelle
3

Ich würde eine andere Datenstruktur verwenden, da das Array nicht die beste Lösung zu sein scheint.

Verwenden Sie anstelle eines Arrays ein Objekt wie folgt als Hash-Tabelle:

(gepostet auch in 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");

Konsolenausgabe:

x exists? - yes
a exists? - no

Das ist eine einfache Lösung. Wenn Sie sich mehr für einen objektorientierten Ansatz interessieren , suchen Sie bei Google nach "js hashtable" .

Ron Klein
quelle
3

IMHO am besten kompatibel mit älteren Browsern

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

Durch Umwandeln einer Array-Kopie in eine CSV-Zeichenfolge können Sie die Zeichenfolge in älteren Browsern testen.

Mark Giblin
quelle
3
Dies ist falsch positiv, wenn eines der Array-Mitglieder die Nadel enthielt, diese aber nicht ausschließlich war. zB ['Lemon Pie'].inArray('Lemon')wird zurückkehren True. Sie können die Nadel mit umwickeln ,, um sie zu umgehen, oder Regex-Matching verwenden, um dies ebenfalls zu tun. Eine Verbindung ist jedoch vorzuziehen, wenn Sie etwas Dunkleres verwenden als ,aus ähnlichen falsch positiven Gründen ( |z. B.). Es hängt vom Datensatz ab
JSDBroughton
1

Warum verwenden Sie Array.filter nicht?

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

Kopieren Sie das einfach in Ihren Code und los geht's:

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

im Array-Beispiel ist es dasselbe in 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
quelle
0
var myArray = [2,5,6,7,9,6];
myArray.includes(2) // is true
myArray.includes(14) // is false
Kaboome
quelle
4
Das Posten eines Codes ist KEINE Antwort. Darüber hinaus sollten Sie Erklärungen hinzufügen.
Xoxel
1
Dieses Codefragment kann das Problem zwar lösen, erklärt jedoch nicht, warum oder wie es die Frage beantwortet. Bitte geben Sie eine Erklärung für Ihren Code an , da dies wirklich zur Verbesserung der Qualität Ihres Beitrags beiträgt. Denken Sie daran, dass Sie die Frage für Leser in Zukunft beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen. Flagger / Rezensenten: Für Nur-Code-Antworten wie diese, Downvote, nicht löschen!
Luca Kiebel
Es gibt bereits mehrere Antworten, die eine Verwendung vorschlagen includes. Wie liefert diese Antwort zusätzliche Werte im Vergleich zu ihnen?
Boghyon Hoffmann
0

Sie können den folgenden Code ausprobieren. Überprüfen Sie 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'); }

Überprüfen Sie arr.length, wenn es mehr als 0 ist, bedeutet dies, dass eine Zeichenfolge vorhanden ist, andernfalls ist sie nicht vorhanden.

Prasad Wargad
quelle
-2

Ich denke, der einfachste Weg ist:

(118 in blockedTile); //is true 
Cristian Mecozzi
quelle