En primer lugar, poner en práctica indexOf
en JavaScript para navegadores que no lo tiene .Por ejemplo, vea Erik Arvidsson's array extras (también, associated blog post). Y luego puede usar indexOf
sin preocuparse por el soporte del navegador. He aquí una versión ligeramente optimizado de su aplicación indexOf
:
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function (obj, fromIndex) {
if (fromIndex == null) {
fromIndex = 0;
} else if (fromIndex < 0) {
fromIndex = Math.max(0, this.length + fromIndex);
}
for (var i = fromIndex, j = this.length; i < j; i++) {
if (this[i] === obj)
return i;
}
return -1;
};
}
Ha cambiado para almacenar la longitud de modo que no tiene que mirar hacia arriba cada iteración. Pero la diferencia no es enorme. Una función de propósito general, menos puede ser más rápido:
var include = Array.prototype.indexOf ?
function(arr, obj) { return arr.indexOf(obj) !== -1; } :
function(arr, obj) {
for(var i = -1, j = arr.length; ++i < j;)
if(arr[i] === obj) return true;
return false;
};
Yo prefiero usar la función estándar y dejando este tipo de micro-optimización para cuando es realmente necesario. Pero si está interesado en la micro-optimización, he adaptado el benchmarks que roosterononacid vinculado en los comentarios, al benchmark searching in arrays. Sin embargo, son bastante crudos, una investigación completa probaría arreglos con diferentes tipos, diferentes longitudes y encontrar objetos que ocurren en diferentes lugares.
Ver: http://stackoverflow.com/a/25765186/1320932 –
2 cosas: 1.) 'incluye' es un nombre realmente malo para una función que no modifica el estado de nada. Es especialmente malo para una función que simplemente devuelve un valor booleano. 2.) Debe agregar "return (false);" antes del final de la función. – Aquarelle
a partir de ECMAScript 2016, puede utilizar la función Array.prototype.includes: myArray.includes (3); // true – mhd