1407 Stimmen

Bestimmen, ob ein Array einen Wert enthält

Ich muss feststellen, ob ein Wert in einem Array vorhanden ist.

Ich verwende die folgende Funktion:

Array.prototype.contains = function(obj) {
    var i = this.length;
    while (i--) {
        if (this[i] == obj) {
            return true;
        }
    }
    return false;
}

Die obige Funktion gibt immer false zurück.

Die Array-Werte und der Funktionsaufruf lauten wie folgt:

arrValues = ["Sam","Great", "Sample", "High"]
alert(arrValues.contains("Sam"));

10 Stimmen

Der Code funktioniert in Safari 4.0.2. Übrigens: Ich würde eine === Vergleich anstelle von nur == .

1 Stimmen

"Die obige Funktion gibt immer false zurück." Nein, das tut sie nicht: Die Funktion funktioniert wie erwartet - der Fehler muss woanders liegen.

2 Stimmen

12voto

Wojciech Bednarski Punkte 5468

Sie können verwenden Methode _.indexOf oder wenn Sie nicht die gesamte Underscore.js-Bibliothek in Ihre Anwendung einbinden wollen, können Sie einen Blick darauf werfen wie sie es gemacht haben und extrahieren Sie den erforderlichen Code.

    _.indexOf = function(array, item, isSorted) {
    if (array == null) return -1;
    var i = 0, l = array.length;
    if (isSorted) {
      if (typeof isSorted == 'number') {
        i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);
      } else {
        i = _.sortedIndex(array, item);
        return array[i] === item ? i : -1;
      }
    }
    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
    for (; i < l; i++) if (array[i] === item) return i;
    return -1;
  };

10voto

Hunan Rostomyan Punkte 2146

Eine andere Möglichkeit wäre die Verwendung von Array.some ( falls vorhanden ) auf folgende Weise:

Array.prototype.contains = function(obj) {
  return this.some( function(e){ return e === obj } );
}

Die anonyme Funktion, die an Array.some wird zurückgegeben true wenn und nur wenn es ein Element in dem Array gibt, das identisch ist mit obj . Fehlt ein solches Element, gibt die Funktion nicht zurück true für jedes beliebige Element des Arrays, also Array.some wird zurückgegeben false auch.

8voto

Chris Schmitz Punkte 18366

Wow, es gibt eine Menge toller Antworten auf diese Frage.

Ich habe keine gesehen, die eine reduce Ansatz, also füge ich ihn hinzu:

var searchForValue = 'pig';

var valueIsInArray = ['horse', 'cat', 'dog'].reduce(function(previous, current){
    return previous || searchForValue === current ? true : false;
}, false);

console.log('The value "' + searchForValue + '" is in the array: ' + valueIsInArray);

Hier ist ein Bild davon in Aktion .

0 Stimmen

Ich dachte eigentlich daran, diesen Weg zu gehen, aber es muss immer noch das gesamte Feld durchqueren, auch wenn ein Ergebnis gefunden wird.

1 Stimmen

@cgatian Das ist ein guter Punkt. Das sollte man bei der Auswahl der Methode im Hinterkopf behalten. Sie könnten möglicherweise die Anweisung reduce in eine try catch blockieren und eine Ausnahme auslösen, sobald Sie den Wert gefunden haben, aber wenn Sie das tun, verlieren Sie meiner Meinung nach etwas von der Einfachheit, die Ihnen der funktionale Ansatz bietet.

6voto

Kakoroat Punkte 93

Die Antwort, die mir gegeben wurde, hat mich nicht überzeugt, aber sie hat mich auf eine Idee gebracht:

Array.prototype.contains = function(obj)
    {
        return (this.join(',')).indexOf(obj) > -1;
    }

Es ist nicht perfekt, weil Artikel, die über die Gruppierung hinaus gleich sind, am Ende übereinstimmen könnten. Wie in meinem Beispiel

var c=[];
var d=[];
function a()
{
    var e = '1';
    var f = '2';
    c[0] = ['1','1'];
    c[1] = ['2','2'];
    c[2] = ['3','3'];
    d[0] = [document.getElementById('g').value,document.getElementById('h').value];

    document.getElementById('i').value = c.join(',');
    document.getElementById('j').value = d.join(',');
    document.getElementById('b').value = c.contains(d);
}

Wenn ich diese Funktion mit den Feldern "g" und "h" aufrufe, die 1 bzw. 2 enthalten, wird sie dennoch gefunden, da die sich aus der Verknüpfung ergebende Zeichenfolge lautet: 1,1,2,2,3,3

Da es in meiner Situation zweifelhaft ist, dass ich in eine solche Situation komme, verwende ich dies. Ich dachte, ich würde es teilen, falls jemand anderes die gewählte Antwort auch nicht umsetzen kann.

1 Stimmen

Diese Lösung scheint sehr anfällig und fehleranfällig zu sein, außer in den engsten Fällen. Stellen Sie sich zum Beispiel vor, Sie verwenden dieses Array: var arr = ["Smith, Reed", "Jackson, Frank"]; arr.contains(searchTerm); Bild, das ein Benutzer versehentlich eingegeben hat "Reed,Jackson" anstelle von "Reed, Jackson" in einem Textfeld, das dieses Array durchsucht hat. Dieser Algorithmus würde ein falsches Ergebnis liefern und der Benutzer würde denken, dass Reed, Jackson tatsächlich existierte, wenn sie es nicht tut. Fälle wie dieser sind der Grund, warum dieser Algorithmus viel anfälliger für Fehler ist.

2voto

deeban Punkte 81
function setFound(){   
 var l = arr.length, textBox1 = document.getElementById("text1");
    for(var i=0; i<l;i++)
    {
     if(arr[i]==searchele){
      textBox1 .value = "Found";
      return;
     }
    }
    textBox1 .value = "Not Found";
return;
}

Dieses Programm prüft, ob das angegebene Element gefunden wird oder nicht. Id text1 steht für die Id des Textfeldes und searchele für das zu suchende Element gesucht werden soll (vom Benutzer); wenn Sie einen Index wollen, verwenden Sie den Wert i

4 Stimmen

Bitte geben Sie eine Erklärung zu Ihrem Code. Antworten nur auf den Code sind nicht erwünscht

1 Stimmen

Dieses Programm prüft, ob das angegebene Element gefunden wird oder nicht. Id text1 steht für id des Textfeldes und searchele steht für das zu suchende Element (got fron user); wenn Sie index wollen, verwenden Sie i value.

1 Stimmen

Bitte aktualisieren Sie dies in Ihrer Antwort.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X