Crossbrowser "inArray" fonction (sans jQuery)

Je n'étais pas au courant de la mauvaise compatibilité array.indexOf() de array.indexOf() . Mais maintenant que je suis, je dois trouver un moyen d'atteindre la même chose, mais sans utiliser la méthode précédente.

J'ai essayé de googler pendant un moment, mais je n'ai trouvé aucune réponse réelle et convaincante. Pour l'instant, je le fais avec des boucles (mais c'est lent et je suis sûr qu'il y a de meilleures façons)

Notes latérales:

  • Je ne peux pas utiliser jQuery ou d'autres bibliothèques / frameworks.
  • Il n'a pas nécessairement besoin de retourner l'index (un simple vrai / faux va bien)

Je pensais qu'il n'était pas nécessaire de partager mon code, puisque vous savez tous comment fonctionne la boucle de la matrice (plus il réduira votre QI)

Voici comment inArray est implémenté dans jQuery:

 function inArray(elem, array, i) { var len; if ( array ) { if ( array.indexOf ) { return array.indexOf.call( array, elem, i ); } len = array.length; i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; for ( ; i < len; i++ ) { // Skip accessing in sparse arrays if ( i in array && array[ i ] === elem ) { return i; } } } return -1; } 

Vous ne pouvez pas utiliser jQuery mais pourquoi ne pas utiliser leur implémentation? 🙂

Meilleures salutations!

De MDN :

 if (!Array.prototype.indexOf) { Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) { "use strict"; if (this == null) { throw new TypeError(); } var t = Object(this); var len = t.length >>> 0; if (len === 0) { return -1; } var n = 0; if (arguments.length > 0) { n = Number(arguments[1]); if (n != n) { // shortcut for verifying if it's NaN n = 0; } else if (n != 0 && n != Infinity && n != -Infinity) { n = (n > 0 || -1) * Math.floor(Math.abs(n)); } } if (n >= len) { return -1; } var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); for (; k < len; k++) { if (k in t && t[k] === searchElement) { return k; } } return -1; } } 

Cela vérifie s'il voit une implémentation native, sinon l'implémente.

Quirks remarquables:

t.length >>> 0; Est un changement non signé pour la force à un nombre positif

Pour l'instant, je le fais avec des boucles (mais c'est lent et je suis sûr qu'il y a de meilleures façons)

Peu importe ce que vous faites, au bout de la journée, il faudra faire des boucles. À moins que vous ne inventiez un algorithme O (1) pour la recherche à l'intérieur d'un tableau. Il n'y a rien de mal à utiliser une boucle pour trouver l'élément correspondant. Vous pouvez même étendre l'objet de tableau intégré avec cette méthode afin que vous puissiez la réutiliser.