variable style body attribute javascript arrays contains

javascript - style - Determine si una matriz contiene un valor



title html (18)

Array.prototype.includes ()

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

El método includes() determina si una matriz incluye un elemento determinado, devolviendo true o false según corresponda.

Ejemplo

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

Apoyo

Según kangax y MDN , las siguientes plataformas son compatibles:

  • Cromo 47
  • Borde 14
  • Firefox 43
  • Opera 34
  • Safari 9
  • Nodo 6

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

Esta pregunta ya tiene una respuesta aquí:

Necesito determinar si un valor existe 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 la matriz y la llamada a la función son los siguientes:

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


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

Eficiencia porque se puede garantizar que, en cualquier momento, una biblioteca muy popular como el guión bajo tendrá el método más eficiente para lograr 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'');

AVISO: con versiones anteriores de lodash, esto era _.contains() lugar de _.includes() .


Dada la implementación de indexOf para IE (como se describe en eyelidlessness):

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


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


El uso de la función array .map que ejecuta una función para cada valor en una matriz me parece más limpio.

Ref: Array.prototype.map()

Este método puede funcionar bien tanto para matrices simples como para matrices de objetos donde necesita ver si existe una clave / valor en una matriz de objetos.

function inArray(myArray,myValue){ var inArray = false; myArray.map(function(key){ if (key === myValue){ inArray=true; } }); return inArray; }; var anArray = [2,4,6,8] console.log(inArray(anArray, 8)); // returns true console.log(inArray(anArray, 1)); // returns false function inArrayOfObjects(myArray,myValue,objElement){ var inArray = false; myArray.map(function(arrayObj){ if (arrayObj[objElement] === myValue) { inArray=true; } }); return inArray; }; var objArray = [{id:4,value:''foo''},{id:5,value:''bar''}] console.log(inArrayOfObjects(objArray, 4, ''id'')); // returns true console.log(inArrayOfObjects(objArray, ''bar'', ''value'')); // returns true console.log(inArrayOfObjects(objArray, 1, ''id'')); // returns false


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

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


La respuesta proporcionada no funcionó para mí, pero me dio una idea:

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

No es perfecto porque los elementos que son iguales a los de las agrupaciones podrían terminar coincidiendo. Como mi ejemplo

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

Cuando llamo a esta función con los campos ''g'' y ''h'' que contienen 1 y 2 respectivamente, todavía la encuentra porque la cadena resultante de la unión es: 1,1,2,2,3,3

Dado que es dudoso en mi situación que me encuentre con este tipo de situación, estoy usando esto. Pensé que lo compartiría en caso de que alguien más no pudiera hacer que la respuesta elegida funcionara tampoco.


La solución más simple para una función contains , sería una función que se parece a esto:

var contains = function (haystack, needle) { return !!~haystack.indexOf(needle); }

Sin embargo, lo ideal sería que no hiciera de esto una función independiente, sino parte de una biblioteca auxiliar:

var helper = {}; helper.array = { contains : function (haystack, needle) { return !!~haystack.indexOf(needle); }, ... };

Ahora, si eres una de esas personas desafortunadas que aún necesitan soportar IE <9 y por lo tanto no pueden confiar en indexOf , podrías usar este polyfill , que obtuve de la MDN :

if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(searchElement, fromIndex) { var k; if (this == null) { throw new TypeError(''"this" is null or not defined''); } var o = Object(this); var len = o.length >>> 0; if (len === 0) { return -1; } var n = +fromIndex || 0; if (Math.abs(n) === Infinity) { n = 0; } if (n >= len) { return -1; } k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); while (k < len) { if (k in o && o[k] === searchElement) { return k; } k++; } return -1; }; }


Mi pequeña contribución:

function isInArray(array, search) { return array.indexOf(search) >= 0; } //usage if(isInArray(my_array, "my_value")) { //... }


Otra opción sería usar Array.some ( si está disponible ) de la siguiente manera:

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

La función anónima pasada a Array.some devolverá true si y solo si hay un elemento en la matriz que es idéntico a obj . A falta de tal elemento, la función no devolverá true para ninguno de los elementos de la matriz, por lo que Array.some también devolverá false .


Prefiero la simplicidad:

var days = [1, 2, 3, 4, 5]; if ( 2 in days ) {console.log(''weekday'');}


Puede usar el método _.indexOf o si no desea incluir toda la biblioteca Underscore.js en su aplicación, puede ver cómo lo hicieron y extraer el código necesario.

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


Si tiene acceso a ECMA 5, puede utilizar el método some .

MDN ALGUNO Método de Enlace

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 tiene acceso a ECMA 6 puede usar el método de inclusión.

Array.prototype.includes()

arrValues = ["Sam","Great", "Sample", "High"]; arrValues.includes(''Sam''); => true;


Wow, hay muchas respuestas geniales a esta pregunta.

No vi uno que tenga un enfoque de reduce , así que lo agregaré en:

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

Aquí hay un violín en acción .



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 se extienden o no los objetos incorporados, pero 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 muy bien este debate, sin embargo, el enlace se rompió y no puedo editar el comentario original porque ya pasó demasiado tiempo, así que lo incluyo here .

Si está buscando extender el objeto de Array integrado con un método de contenido, probablemente la mejor y más responsable manera de hacerlo sería utilizar este polyfill de Array.prototype.includes() . (Consulte también this sección del artículo de MDN sobre herencia prototípica, que explica que "La única buena razón para extender un prototipo incorporado es para 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 la 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; }


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

Este programa verifica si el elemento dado se encuentra o no. Id text1 representa id del cuadro de texto y searchele representa el elemento que debe buscarse (se obtuvo del usuario); Si quieres índice, usa el valor i


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