Double Possible:
tableau.contient(obj) en JavaScriptQuelle est la meilleure façon de savoir si un objet est dans un tableau?
C'est le meilleur moyen que je connaisse:
function include(arr, obj) { for(var i=0; i<arr.length; i++) { if (arr[i] == obj) return true; } } include([1,2,3,4], 3); // true include([1,2,3,4], 6); // undefined
- tableau.contient(obj) en JavaScript (5 réponses )
Réponses
Trop de publicités?function include(arr,obj) {
return (arr.indexOf(obj) != -1);
}
EDIT: Cela ne fonctionne pas sur IE6, 7 ou 8. La meilleure solution est de définir vous-même si il n'est pas présent:
-
Mozilla est (ECMA-262) la version:
if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(searchElement /*, fromIndex */) { "use strict"; if (this === void 0 || 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) n = 0; else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) 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; }; }
-
Daniel James's version:
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; }; }
-
roosteronacid's version:
Array.prototype.hasObject = ( !Array.indexOf ? function (o) { var l = this.length + 1; while (l -= 1) { if (this[l - 1] === o) { return true; } } return false; } : function (o) { return (this.indexOf(o) !== -1); } );
Tout d'abord, mettre en oeuvre indexOf
en JavaScript pour les navigateurs qui ne l'est pas déjà. Voir, par exemple, Erik Arvidsson du tableau extras (également, les associés blog post). Et puis vous pouvez utiliser indexOf
sans vous soucier de la prise en charge du navigateur. Ici est un peu une version optimisée de son indexOf
mise en œuvre:
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;
};
}
Il a changé pour stocker la longueur de sorte qu'il n'a pas besoin de le chercher chaque itération. Mais la différence n'est pas énorme. Moins objectif général de la fonction pourrait être plus rapide:
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;
};
Je préfère utiliser la fonction standard et en laissant ce genre de micro-optimisation pour quand c'est vraiment nécessaire. Mais si vous êtes désireux sur la micro-optimisation, j'ai adapté les critères de référence qui roosterononacid liés à la dans les commentaires, à l' indice de référence de la recherche dans des tableaux. Ils sont assez brut cependant, une enquête approfondie permettrait de tester des tableaux avec différents types, différentes longueurs et de trouver des objets qui se produisent dans des endroits différents.
Si le tableau est trié, il n'est pas vraiment une meilleure façon (à part en utilisant le mentionnés ci-dessus indexOf, qui, je pense, revient à la même chose). Si le tableau est trié, vous pouvez faire une recherche binaire, qui fonctionne comme ceci:
- Choisissez le moyen de l'élément de la matrice.
- C'est l'élément que vous recherchez plus grand que l'élément que vous avez choisi? Si oui, vous avez éliminé la moitié inférieure du tableau. Si ce n'est pas le cas, vous avez éliminé la moitié supérieure.
- Choisissez le moyen de l'élément de l'autre moitié du tableau, et vous continuez à l'étape 2, en éliminant les moitiés de le reste de la matrice. Éventuellement, vous allez trouver votre élément ou n'ont pas de tableau de gauche à regarder à travers.
Binaire de recherche fonctionne en temps proportionnel au logarithme de la longueur de la matrice, de sorte qu'il peut être beaucoup plus rapide que de le regarder chaque élément individuel.
en supposant que .indexOf() est mis en œuvre peuvent mettre en œuvre quelque chose de semblable à obj.hasOwnProperty(prop)
Object.defineProperty( Array.prototype,'has',
{
value:function(o){return this.indexOf(o)!=-1},
// writable:false,
// enumerable:false
}
)
maintenant, la nouvelle méthode peut être utilisée comme
[22 ,'a', {prop:'x'}].has(12)
retourner false