Frage Bestimmen, ob ein Array einen Wert enthält [duplizieren]


Diese Frage hat hier bereits eine Antwort:

Ich muss feststellen, ob ein Wert in einem Array existiert.

Ich verwende 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 sind wie folgt:

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

1148
2017-07-25 08:18


Ursprung


Antworten:


var contains = function(needle) {
    // Per spec, the way to identify NaN is that it is not equal to itself
    var findNaN = needle !== needle;
    var indexOf;

    if(!findNaN && typeof Array.prototype.indexOf === 'function') {
        indexOf = Array.prototype.indexOf;
    } else {
        indexOf = function(needle) {
            var i = -1, index = -1;

            for(i = 0; i < this.length; i++) {
                var item = this[i];

                if((findNaN && item !== item) || item === needle) {
                    index = i;
                    break;
                }
            }

            return index;
        };
    }

    return indexOf.call(this, needle) > -1;
};

Du kannst es so benutzen:

var myArray = [0,1,2],
    needle = 1,
    index = contains.call(myArray, needle); // true

CodePen Validierung / Verwendung


949
2017-07-25 08:22



jQuery hat dafür eine Nutzenfunktion:

$.inArray(value, array)

Gibt den Index von value im array. Kehrt zurück -1 ob array beinhaltet nicht value.

Siehe auch Wie überprüfe ich, ob ein Array ein Objekt in JavaScript enthält?


927
2017-09-24 19:34



In der Regel ist dies die Methode indexOf (). Du würdest sagen:

return arrValues.indexOf('Sam') > -1

745
2017-07-25 08:25



Array.prototype.includes ()

In ES2016 gibt es Array.prototype.includes().

Das includes() Methode bestimmt, ob ein Array ein bestimmtes Element enthält und zurückgibt true oder false wie angemessen.

Beispiel

["Sam", "Great", "Sample", "High"].includes("Sam"); // true

Unterstützung

Gemäß Kangax und MDNFolgende Plattformen werden unterstützt:

  • Chrome 47
  • Kante 14
  • Firefox 43
  • Oper 34
  • Safari 9
  • Knoten 6

Support kann mit erweitert werden Babel (unter Verwendung von babel-polyfill) oder core-js. MDN bietet auch eine Polyfill:

if (![].includes) {
  Array.prototype.includes = function(searchElement /*, fromIndex*/ ) {
    'use strict';
    var O = Object(this);
    var len = parseInt(O.length) || 0;
    if (len === 0) {
      return false;
    }
    var n = parseInt(arguments[1]) || 0;
    var k;
    if (n >= 0) {
      k = n;
    } else {
      k = len + n;
      if (k < 0) {k = 0;}
    }
    var currentElement;
    while (k < len) {
      currentElement = O[k];
      if (searchElement === currentElement ||
         (searchElement !== searchElement && currentElement !== currentElement)) {
        return true;
      }
      k++;
    }
    return false;
  };
}

246
2018-06-09 06:45



Es ist fast immer sicherer, eine Bibliothek wie zu verwenden lodash einfach wegen all der Probleme mit Cross-Browser-Kompatibilität und Effizienz.

Effizienz, weil Sie sicherstellen können, dass zu jeder beliebigen Zeit eine sehr beliebte Bibliothek wie Unterstriche die effizienteste Methode zum Ausführen einer solchen Dienstprogrammfunktion hat.

_.includes([1, 2, 3], 3); // returns true

Wenn Sie Bedenken hinsichtlich der Menge haben, die Ihrer Anwendung hinzugefügt wird, indem Sie die gesamte Bibliothek einschließen, sollten Sie wissen, dass Sie Funktionalität separat hinzufügen können:

var includes = require('lodash/collections/includes');

BEACHTEN: Mit älteren Versionen von lodash war dies _.contains() eher, als _.includes().


116
2018-01-25 03:00



tl; dr 

function includes(k) {
  for(var i=0; i < this.length; i++){
    if( this[i] === k || ( this[i] !== this[i] && k !== k ) ){
      return true;
    }
  }
  return false;
}

Beispiel

function includes(k) {
  for(var i=0; i < this.length; i++){
    if( this[i] === k || ( this[i] !== this[i] && k !== k ) ){
      return true;
    }
  }
  return false;
}

function log(msg){
  $('#out').append('<div>' + msg + '</div>');  
}

var arr = [1, "2", NaN, true];
arr.includes = includes;

log('var arr = [1, "2", NaN, true];');
log('<br/>');
log('arr.includes(1): ' + arr.includes(1));
log('arr.includes(2): ' + arr.includes(2));
log('arr.includes("2"): ' + arr.includes("2"));
log('arr.includes(NaN): ' + arr.includes(NaN));
log('arr.includes(true): ' + arr.includes(true));
log('arr.includes(false): ' + arr.includes(false));
#out{
  font-family:monospace;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id=out></div>

Längere Antwort

Ich weiß, dass es bei dieser Frage nicht wirklich darum geht, eingebaute Objekte zu erweitern oder nicht, aber der Versuch des OP und die Kommentare zu dieser Antwort heben diese Debatte hervor. Mein Kommentar vom 12. Februar '13 zitiert einen Artikel, der diese Debatte sehr gut umreißt, aber dieser Link ist kaputt gegangen und ich kann den ursprünglichen Kommentar nicht bearbeiten, weil zu viel Zeit vergangen ist, also schließe ich ihn ein Hier.

Wenn Sie das eingebaute System erweitern möchten Array Objekt mit a contains Methode, wahrscheinlich der beste und am meisten verantwortliche Weg, dies zu tun wäre, diese Polyfill aus zu verwenden MDN. (Siehe auch Dies Abschnitt des MDN-Artikels zur prototypischen Vererbung, der das erklärt "Der einzige gute Grund für die Erweiterung eines integrierten Prototyps besteht darin, die Funktionen neuerer JavaScript-Module rückzuportieren, beispielsweise Array.forEach usw.")

if (!Array.prototype.includes) {
  Array.prototype.includes = function(searchElement /*, fromIndex*/ ) {
    'use strict';
    var O = Object(this);
    var len = parseInt(O.length) || 0;
    if (len === 0) {
      return false;
    }
    var n = parseInt(arguments[1]) || 0;
    var k;
    if (n >= 0) {
      k = n;
    } else {
      k = len + n;
      if (k < 0) {k = 0;}
    }
    var currentElement;
    while (k < len) {
      currentElement = O[k];
      if (searchElement === currentElement ||
         (searchElement !== searchElement && currentElement !== currentElement)) {
        return true;
      }
      k++;
    }
    return false;
  };
}

Willst du keine strenge Gleichheit, oder willst du wählen?

function includes(k, strict) {
  strict = strict !== false; // default is true
  // strict = !!strict; // default is false
  for(var i=0; i < this.length; i++){
    if( (this[i] === k && strict) || 
        (this[i] == k && !strict) ||
        (this[i] !== this[i] && k !== k)
    ) {
      return true;
    }
  }
  return false;
}

46
2017-09-15 20:03



Seit ECMAScript6 kann man verwenden Set:

var myArray = ['A', 'B', 'C'];
var mySet = new Set(myArray);
var hasB = mySet.has('B'); // true
var hasZ = mySet.has('Z'); // false

32
2018-01-07 13:05



Mein kleiner Beitrag:

function isInArray(array, search)
{
    return array.indexOf(search) >= 0;
}

//usage
if(isInArray(my_array, "my_value"))
{
    //...
}

18
2017-09-13 17:29



Angesichts der Implementierung von indexOf für IE (wie von Lidlessness beschrieben):

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

17
2017-07-25 09:12



Wenn Sie Zugang zu ECMA 5 haben, können Sie die etwas Methode.

MDN SOME Methodenverknüpfung

arrValues = ["Sam","Great", "Sample", "High"];

function namePresent(name){
  return name === this.toString();
}
// Note:
// namePresent requires .toString() method to coerce primitive value
// i.e. String {0: "S", 1: "a", 2: "m", length: 3, [[PrimitiveValue]]: "Sam"}
// into
// "Sam"

arrValues.some(namePresent, 'Sam');
=> true;

Wenn Sie Zugang zu ECMA 6 haben, können Sie die beinhaltet Methode.

MDN enthält Method Link

arrValues = ["Sam","Great", "Sample", "High"];

arrValues.includes('Sam');
=> true;

15
2017-07-31 15:46