201 votes

Comment déterminer si un objet est dans un tableau

J'ai besoin de déterminer si un objet existe déjà dans un tableau en javascript.

par exemple, (dummycode):

var carBrands = [];

var car1 = {name:'ford'};
var car2 = {name:'lexus'};
var car3 = {name:'maserati'};
var car4 = {name:'ford'};

carBrands.push(car1);
carBrands.push(car2);
carBrands.push(car3);
carBrands.push(car4);

maintenant, le "carBrands" tableau contient toutes les instances. Je suis maintenant à la recherche d'une solution rapide pour vérifier si une instance de car1, les personnages car2, car3 ou car4 est déjà dans le carBrands tableau.

par exemple:

var contains =  carBrands.Contains(car1); //<--- returns bool.

car1 et car4 contiennent les mêmes données, mais qui sont différents cas, ils doivent être testés de ne pas l'égalité.

Dois-je ajouter quelque chose comme une table de hachage pour les objets sur la création? Ou est-il un moyen plus rapide de faire cela en Javascript.

Je suis à la recherche de la solution la plus rapide ici, si sale, de sorte qu'il doit être ;) Dans mon application, elle doit composer avec près de 10000 cas.

pas de jquery

175voto

cdhowie Points 62253

Utilisez quelque chose comme ceci:

 function containsObject(obj, list) {
    var i;
    for (i = 0; i < list.length; i++) {
        if (list[i] === obj) {
            return true;
        }
    }

    return false;
}
 

Dans ce cas, containsObject(car4, carBrands) est vrai. Supprimez l'appel carBrands.push(car4); et il retournera faux à la place. Si vous développez plus tard l'utilisation d'objets pour stocker ces autres objets car au lieu d'utiliser des tableaux, vous pouvez utiliser quelque chose comme ceci:

 function containsObject(obj, list) {
    var x;
    for (x in list) {
        if (list.hasOwnProperty(x) && list[x] === obj) {
            return true;
        }
    }

    return false;
}
 

Cette approche fonctionnera également pour les tableaux, mais si elle est utilisée sur des tableaux, elle sera un peu plus lente que la première option.

138voto

Frax Points 535

Pourquoi n'utilisez-vous pas la méthode indexOf des tableaux javascript?

Découvrez ceci: W3Schools indexOf Arrays

Faites simplement:

 carBrands.indexOf(car1);
 

Cela vous retournera l'index (position dans le tableau) de car1. Il retournera -1 si car1 n'a pas été trouvé dans le tableau.

18voto

stef Points 6478

Vous pouvez utiliser la méthode grep de jQuery :

 $.grep(carBrands, function(obj) { return obj.name == "ford"; });
 

Mais comme vous ne spécifiez pas jQuery, vous pouvez simplement créer une dérivée de la fonction. A partir du code source:

 function grepArray( elems, callback, inv ) {  
    var ret = [];  

    // Go through the array, only saving the items  
    // that pass the validator function  
    for ( var i = 0, length = elems.length; i < length; i++ ) {  
        if ( !inv !== !callback( elems[ i ], i ) ) {  
            ret.push( elems[ i ] );  
        }  
    }  

    return ret;  
}  

grepArray(carBrands, function(obj) { return obj.name == "ford"; });
 

10voto

Jinesh Points 575

J'ai utilisé la bibliothèque javascript underscore pour régler ce problème.

 function containsObject(obj, list) {
 var res = _.find(list, function(val){ return _.isEqual(obj, val)});
 return (_.isObject(res))? true:false;
}
 

Veuillez vous reporter à la documentation de underscore.js pour les fonctions de soulignement utilisées dans l'exemple ci-dessus.

remarque: ma solution n’est pas du javascript pur, car elle utilise d’autres bibliothèques js. J'ai ajouté ceci à des fins d'information uniquement.

9voto

zzzzBov Points 62084

Vous pouvez simplement utiliser l'opérateur d'égalité: ==. Les objets sont vérifiées par référence par défaut, de sorte que vous n'avez même pas besoin d'utiliser l' === de l'opérateur.

essayez cette, assurez-vous que vous utilisez la bonne variable de référence à la place de car1:

var i, car, l = cars.length;

for (i = 0; i < l; i++)
{
  if ((car = cars[i]) == car1)
  {
    break;
  }
  else car = null;
}

Modifier pour ajouter:

Un tableau d'extension a été mentionné, donc voici le code:

Array.prototype.contains = Array.prototype.contains || function(obj)
{
  var i, l = this.length;
  for (i = 0; i < l; i++)
  {
    if (this[i] == obj) return true;
  }
  return false;
};

Notez que je me suis mise en cache de la valeur de la longueur, comme le Tableau est length l'immobilier est en fait un accesseur, ce qui est légèrement plus lente qu'une variable interne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X