Question Déterminer si un tableau contient une valeur [dupliquer]


Cette question a déjà une réponse ici:

J'ai besoin de déterminer si une valeur existe dans un tableau.

J'utilise la fonction suivante:

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

La fonction ci-dessus renvoie toujours false.

Les valeurs de tableau et l'appel de fonction est comme ci-dessous:

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

1148
2017-07-25 08:18


origine


Réponses:


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

Vous pouvez l'utiliser comme ceci:

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

Validation / utilisation de CodePen


949
2017-07-25 08:22



jQuery a une fonction d'utilité pour ceci:

$.inArray(value, array)

Retourne l'index de value dans array. Résultats -1 si array ne contient pas value.

Voir également Comment puis-je vérifier si un tableau inclut un objet dans JavaScript?


927
2017-09-24 19:34



C'est généralement ce à quoi sert la méthode indexOf (). Tu dirais:

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

745
2017-07-25 08:25



Array.prototype.includes ()

En ES2016, il y a Array.prototype.includes().

le includes() méthode détermine si un tableau comprend un certain élément, retour true ou false le cas échéant.

Exemple

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

Soutien

Selon kangax et MDN, les plates-formes suivantes sont supportées:

  • Chrome 47
  • Edge 14
  • Firefox 43
  • Opéra 34
  • Safari 9
  • Noeud 6

Le support peut être étendu en utilisant Babel (en utilisant babel-polyfill) ou core-js. MDN fournit également un 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



Il est presque toujours plus sûr d'utiliser une bibliothèque comme lodash simplement à cause de tous les problèmes de compatibilité et d'efficacité entre navigateurs.

Efficacité parce que vous pouvez être assuré qu'à tout moment, une bibliothèque extrêmement populaire comme le soulignement aura la méthode la plus efficace pour accomplir une fonction d'utilité comme celle-ci.

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

Si vous êtes préoccupé par le volume qui est ajouté à votre application en incluant la bibliothèque entière, sachez que vous pouvez inclure des fonctionnalités séparément:

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

REMARQUER: Avec les anciennes versions de lodash, c'était _.contains() plutôt que _.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;
}

Exemple

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>

Réponse plus longue

Je sais que cette question ne concerne pas vraiment l'extension ou non des objets intégrés, mais la tentative du PO et les commentaires sur cette réponse soulignent ce débat. Mon commentaire du 12 février 13 cite un article qui décrit très bien ce débat, cependant ce lien s'est cassé et je ne peux pas éditer le commentaire original parce que trop de temps est passé, donc je l'inclue ici.

Si vous cherchez à étendre le built-in Array objet avec un contains méthode, probablement la meilleure et la plus responsable pour ce faire serait d'utiliser ce polyfill de MDN. (Voir également ce section de l'article de MDN sur l'héritage prototypique, qui explique que "La seule bonne raison d'étendre un prototype intégré est de sauvegarder les fonctionnalités des nouveaux moteurs JavaScript, par exemple Array.forEach, etc.")

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

Vous ne voulez pas d'égalité stricte, ou voulez choisir?

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



Depuis ECMAScript6, on peut utiliser 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



Ma petite contribution:

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

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

18
2017-09-13 17:29



Compte tenu de l'implémentation de indexOf pour IE (comme décrit par eyelidlessness):

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

17
2017-07-25 09:12



Si vous avez accès à ECMA 5, vous pouvez utiliser le certains méthode.

MDN SOME Lien de méthode

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;

Si vous avez accès à ECMA 6, vous pouvez utiliser le inclut méthode.

MDN INCLUDES Méthode Lien

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

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

15
2017-07-31 15:46



Vous pouvez utiliser Méthode _.indexOf ou si vous ne voulez pas inclure toute la bibliothèque Underscore.js dans votre application, vous pouvez jeter un oeil comment ils l'ont fait et extraire le code nécessaire.

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

11
2018-01-11 16:54