saber repetidos objetos objects existe elementos elemento ejemplo contar caracter cadena buscar array javascript internet-explorer internet-explorer-8 indexof

javascript - repetidos - ¿Por qué no funciona indexOf en un array IE8?



javascript indexof array of objects (7)

El problema

IE <= 8 simplemente no tiene un método .indexOf() para los arreglos.

La solución

Si necesita indexOf en IE <= 8, debe considerar el uso del siguiente polyfill , que se .indexOf() :

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

Minificado

Array.prototype.indexOf||(Array.prototype.indexOf=function(r,t){var n;if(null==this)throw new TypeError(''"this" is null or not defined'');var e=Object(this),i=e.length>>>0;if(0===i)return-1;var a=+t||0;if(Math.abs(a)===1/0&&(a=0),a>=i)return-1;for(n=Math.max(a>=0?a:i-Math.abs(a),0);i>n;){if(n in e&&e[n]===r)return n;n++}return-1});

La siguiente función funciona bien en Opera, Firefox y Chrome. Sin embargo, en IE8 falla en la parte if ( allowed.indexOf(ext[1]) == -1) .

¿Alguien sabe por qué? ¿Hay algún error obvio?

function CheckMe() { var allowed = new Array(''docx'',''xls'',''xlsx'', ''mp3'', ''mp4'', ''3gp'', ''sis'', ''sisx'', ''mp3'', ''wav'', ''mid'', ''amr'', ''jpg'', ''gif'', ''png'', ''jpeg'', ''txt'', ''pdf'', ''doc'', ''rtf'', ''thm'', ''rar'', ''zip'', ''htm'', ''html'', ''css'', ''swf'', ''jar'', ''nth'', ''aac'', ''cab'', ''wgz''); var fileinput=document.getElementById(''f''); var ext = fileinput.value.toLowerCase().split(''.''); if ( allowed.indexOf(ext[1]) == -1) { document.getElementById(''uploadsec'').innerHTML = document.getElementById(''uploadsec'').innerHTML; alert(''This file type is not allowed!''); } }


Las versiones de IE antes de IE9 no tienen una función .indexOf() para Array, para definir la versión de la especificación exacta , ejecute esto antes de intentar usarla:

if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(elt /*, from*/) { var len = this.length >>> 0; var from = Number(arguments[1]) || 0; from = (from < 0) ? Math.ceil(from) : Math.floor(from); if (from < 0) from += len; for (; from < len; from++) { if (from in this && this[from] === elt) return from; } return -1; }; }

Esta es la versión de MDN , utilizada en Firefox / SpiderMonkey. En otros casos, como IE, agregará .indexOf() en el caso de que falte ... básicamente IE8 o inferior en este punto.



Por favor tenga cuidado con $ .inArray si quiere usarlo. Acabo de descubrir que $ .inArray solo funciona con "Array", no con String. Es por eso que esta función no funcionará en IE8!

La API de jQuery crea confusión.

El método $ .inArray () es similar al método nativo .indexOf () de JavaScript en que devuelve -1 cuando no encuentra una coincidencia. Si el primer elemento dentro de la matriz coincide con el valor, $ .inArray () devuelve 0

-> No deberían decirlo "Similar". Desde indexOf soporte "String" también!


Puedes usar esto para reemplazar la función si no existe:

<script> if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(elt /*, from*/) { var len = this.length >>> 0; var from = Number(arguments[1]) || 0; from = (from < 0) ? Math.ceil(from) : Math.floor(from); if (from < 0) from += len; for (; from < len; from++) { if (from in this && this[from] === elt) return from; } return -1; }; } </script>


Si está usando jQuery, puede usar $.inArray() lugar.


Si está utilizando jQuery y desea seguir usando indexOf sin preocuparse por los problemas de compatibilidad, puede hacer esto:

if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(val) { return jQuery.inArray(val, this); }; }

Esto es útil cuando desea seguir utilizando indexOf pero proporciona un respaldo cuando no está disponible.