Pregunta Determine si una matriz contiene un valor [duplicado]


Esta pregunta ya tiene una respuesta aquí:

Necesito determinar si existe un valor en una matriz.

Estoy usando la siguiente función:

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

La función anterior siempre devuelve falso.

Los valores de matriz y la llamada a la función son los siguientes:

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

1148
2017-07-25 08:18


origen


Respuestas:


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

Puedes usarlo así:

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

Validación / uso de CodePen


949
2017-07-25 08:22



jQuery tiene una función de utilidad para esto:

$.inArray(value, array)

Devuelve el índice de value en array. Devoluciones -1 Si array no contiene value.

Ver también ¿Cómo puedo verificar si una matriz incluye un objeto en JavaScript?


927
2017-09-24 19:34



Esto es generalmente para lo que es el método indexOf (). Tu dirías:

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

745
2017-07-25 08:25



Array.prototype.includes ()

En ES2016, hay Array.prototype.includes().

los includes() método determina si una matriz incluye un elemento determinado, regresando true o false según sea apropiado.

Ejemplo

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

Apoyo

De acuerdo a kangax y MDN, las siguientes plataformas son compatibles:

  • Chrome 47
  • Edge 14
  • Firefox 43
  • Opera 34
  • Safari 9
  • Nodo 6

El soporte se puede expandir usando Babel (utilizando babel-polyfill) o core-js. MDN también proporciona una 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



Casi siempre es más seguro usar una biblioteca como lodash simplemente debido a todos los problemas con las compatibilidades y la eficiencia entre navegadores.

Eficiencia porque se le puede garantizar que en cualquier momento dado, una biblioteca enormemente popular, como el subrayado, tendrá el método más eficiente para realizar una función de utilidad como esta.

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

Si le preocupa el volumen que se agrega a su aplicación al incluir toda la biblioteca, sepa que puede incluir la funcionalidad por separado:

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

DARSE CUENTA: Con versiones anteriores de lodash, esto era _.contains() más bien 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;
}

Ejemplo

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>

Respuesta más larga

Sé que esta pregunta no es realmente acerca de si extender o no los objetos incorporados, sino que el intento del OP y los comentarios sobre esta respuesta resaltan ese debate. Mi comentario del 12 de febrero de '13 cita un artículo que describe este debate muy bien, sin embargo ese enlace se rompió y no puedo editar el comentario original porque ha pasado demasiado tiempo, así que lo incluyo aquí.

Si está buscando extender el built-in Array objeto con un contains método, probablemente la mejor y más responsable forma de hacerlo sería utilizar este relleno MDN. (Ver también esta sección del artículo de MDN sobre herencia prototípica, que explica que "La única buena razón para extender un prototipo integrado es respaldar las características de los nuevos motores de JavaScript, por ejemplo, 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;
  };
}

¿No quieres una igualdad estricta o quieres elegir?

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



Desde ECMAScript6, uno puede usar 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



Mi pequeña contribución

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

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

18
2017-09-13 17:29