1412 votes

Comment déterminer si un tableau Javascript contient un objet dont l'attribut est égal à une valeur donnée ?

J'ai un tableau comme

vendors = [{
    Name: 'Magenic',
    ID: 'ABC'
  },
  {
    Name: 'Microsoft',
    ID: 'DEF'
  } // and so on... 
];

Comment puis-je vérifier ce tableau pour voir si "Magenic" existe ? Je ne veux pas faire de boucle, à moins d'y être obligé. Je travaille avec potentiellement quelques milliers d'enregistrements.

1 votes

Veuillez pardonner ce commentaire apparemment aléatoire, mais votre question concernait-elle JSON ou seulement les tableaux JavaScript ?

11 votes

La solution de @CAFxX est meilleure, ce serait génial si vous mettiez à jour la solution sélectionnée.

3 votes

D'accord, je n'avais pas vu ça avant !

2207voto

CAFxX Points 3911

Pas besoin de réinventer le roue du moins pas explicitement (en utilisant fonctions de la flèche , navigateurs modernes uniquement ) :

if (vendors.filter(e => e.Name === 'Magenic').length > 0) {
  /* vendors contains the element we're looking for */
}

ou, mieux encore car il permet au navigateur de s'arrêter dès qu'il trouve un élément correspondant, ce qui le rend plus rapide :

if (vendors.some(e => e.Name === 'Magenic')) {
  /* vendors contains the element we're looking for */
}

EDIT : Si vous avez besoin d'une compatibilité avec les navigateurs pourris, votre meilleure option est.. :

if (vendors.filter(function(e) { return e.Name === 'Magenic'; }).length > 0) {
  /* vendors contains the element we're looking for */
}

384voto

Alex Turpin Points 17272

Edition 2018 : Cette réponse date de 2011, avant que les navigateurs ne disposent de méthodes de filtrage des tableaux et de fonctions fléchées largement prises en charge. Jetez un coup d'œil à La réponse de CAFxX .

Il n'y a pas de moyen "magique" de vérifier quelque chose dans un tableau sans boucle. Même si vous utilisez une fonction, la fonction elle-même utilisera une boucle. Ce que vous pouvez faire, c'est sortir de la boucle dès que vous trouvez ce que vous cherchez afin de minimiser le temps de calcul.

var found = false;
for(var i = 0; i < vendors.length; i++) {
    if (vendors[i].Name == 'Magenic') {
        found = true;
        break;
    }
}

219voto

boxtrain Points 703

Pas de boucle nécessaire. Trois méthodes qui me viennent à l'esprit :

Array.prototype.some()

C'est la réponse la plus exacte à votre question, c'est-à-dire "vérifier si quelque chose existe", ce qui implique un résultat bool. Ce sera vrai s'il y a des objets 'Magenic', faux sinon :

let hasMagenicVendor = vendors.some( vendor => vendor['Name'] === 'Magenic' )

Array.prototype.filter()

Ceci retournera un tableau de tous les objets 'Magenic', même s'il n'y en a qu'un seul (retournera un tableau à un élément) :

let magenicVendors = vendors.filter( vendor => vendor['Name'] === 'Magenic' )

Si vous essayez de convertir cela en booléen, cela ne fonctionnera pas, car un tableau vide (sans objets 'Magenic') est toujours vrai. Il suffit donc d'utiliser magenicVendors.length dans votre conditionnel.

Array.prototype.find()

Cela renverra le premier objet 'Magenic' (ou undefined s'il n'y en a pas) :

let magenicVendor = vendors.find( vendor => vendor['Name'] === 'Magenic' );

Cela coercitive à un booléen ok (tout objet est vrai, undefined n'est pas fiable).


Remarque : j'utilise vendor["Name"] au lieu de vendor.Name en raison de la casse bizarre des noms de propriétés.

Note 2 : Il n'y a aucune raison d'utiliser une égalité libre (==) au lieu d'une égalité stricte (===) lors de la vérification du nom.

82voto

TeaCode Points 1282

La réponse acceptée fonctionne toujours, mais nous avons maintenant des méthodes natives ECMAScript 6. [Array.find][1] y [Array.some][2] pour obtenir le même effet.

Array.some

Utilisez some Si vous voulez seulement déterminer si un élément existe, c'est-à-dire si vous avez besoin d'un fichier de type true/false détermination.

Je cite MDN :

La méthode some() vérifie si au moins un élément du tableau passe le test mis en œuvre par la fonction fournie. Elle renvoie true si, dans le tableau, elle trouve un élément pour lequel la fonction fournie renvoie true ; sinon elle renvoie false. Elle ne modifie pas le tableau.

Array.find

Utilisez find si vous voulez récupérer l'objet correspondant dans le tableau, sinon, vous obtenez les résultats suivants undefined .

Je cite MDN :

La méthode find() renvoie la valeur du premier élément du tableau fourni qui satisfait à la fonction de test fournie. Si aucune valeur ne satisfait à la fonction de test, la méthode renvoie undefined.

var arr = [];
var item1 = {
    id: 21,
    label: 'Banana',
};
var item2 = {
    id: 22,
    label: 'Apple',
};
arr.push(item1, item2);

/* note : data is the actual object that matched search criteria 
  or undefined if nothing matched */

var data = arr.find(function(ele) {
    return ele.id === 21;
});

if (data) {
    console.log('found');
    console.log(data); // This is entire object i.e. `item` not boolean
}

/* note : doesExist is a boolean thats true or false depending on of whether the data was found or not */
var doesExist = arr.some(function(ele) {
    return ele.id === 21;
});

Voir mon lien jsfiddle Il existe un polyfill pour IE fourni par mozilla

52voto

Mirza Leka Points 491

Voici comment je procéderais

const found = vendors.some(item => item.Name === 'Magenic');

array.some() vérifie s'il existe au moins une valeur dans un tableau qui correspond aux critères et renvoie un booléen. À partir de là, vous pouvez utiliser la méthode :

if (found) {
// do something
} else {
// do something else
}

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