javascript - objects - Soporte de navegador para array.include y alternativas
javascript array indexof with objects (2)
Lo busqué y encontré esto con respecto a encontrar una subcadena en una cadena más grande en una matriz. Array.Prototype.includes
if (t.title.includes(searchString))
Mi t
es parte de un $.each
que está iterando a través de una matriz más grande de objetos (cada objeto tiene una gran cantidad de información, de cadenas, fechas y demás). searchString
es lo que el usuario escribió en un cuadro. Todo esto es una función de búsqueda simple para una lista que tengo en la página.
Esto funciona bien en Chrome. Pero Firefox e IE están apareciendo errores que indican
TypeError: currentTicket.title.includes is not a function
Entonces, ¿puse una señal de advertencia de que mi aplicación solo funciona en Chrome o estoy creando una función de búsqueda? Lo extraño es que la página de documentos de MDN que array.includes
indica que solo Firefox admite la array.includes
. array.includes
, curiosamente, solo es Chrome quien lo ejecuta.
Como dice el artículo de MDN al que has vinculado, Firefox solo admite .includes
en compilaciones nocturnas, otros navegadores no lo .includes
en absoluto en el momento de la última actualización del artículo (es posible que Chrome se haya actualizado para .includes
más adelante). Si desea admitir todos los navegadores, puede utilizar el polyfill descrito en el mismo artículo:
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;
};
}
Sin embargo, parece que su problema tiene una mejor solución, pero es difícil decirlo sin detalles específicos.
En lugar de usar una API que actualmente está marcada como "experimental", considere usar un método más ampliamente compatible, como Array.prototype.indexOf()
(que también es compatible con IE).
En lugar de t.title.includes(string)
puede usar t.title.indexOf(string) >= 0
También puede usar Array.prototype.filter()
para obtener una nueva matriz de cadenas que cumplan con ciertos criterios, como en el siguiente ejemplo.
var arr = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"];
document.getElementById("input").onkeyup = function() {
document.getElementById("output").innerHTML = arrayContainsString(arr,this.value);
}
document.getElementById("header").innerHTML = JSON.stringify(arr);
function arrayContainsString(array, string) {
var newArr = array.filter(function(el) {
return el.indexOf(string) >= 0;
});
return newArr.length > 0;
}
<input id="input" type="text" />
<br/>
<div>array contains text:<span id="output" />
</div>
<div id="header"></div>