J'ai un tableau comme
vendors = [
{
Name: 'Magenic',
ID: 'ABC'
},
{
Name: 'Microsoft',
ID: 'DEF'
} //and so on goes array...
];
Comment puis-je vérifier ce tableau pour voir si Magenic existe? Je ne veux pas faire de boucle, sauf si je le dois. Je travaille avec potentiellement quelques milliers de disques.
MISE À JOUR
Comme il s'agit d'un article populaire, j'ai pensé partager quelque chose de nouveau que j'ai trouvé. Et il semble que @CAFxX a déjà partagé cela! Je devrais les lire plus souvent. Je suis tombé sur https://benfrain.com/understanding-native-javascript-array-methods/ .
vendors.filter(function(vendor){ return vendor.Name === "Magenic" })
Et avec ECMAScript 2015, il est encore plus simple d'utiliser les nouvelles fonctions fléchées:
vendors.filter(vendor => vendor.Name === "Magenic")
javascript
arrays
David Lozzi
la source
la source
Réponses:
Édition 2018 : cette réponse date de 2011, avant que les navigateurs ne disposent de méthodes de filtrage de tableau et de fonctions fléchées largement prises en charge. Jetez un œil à la réponse de CAFxX .
Il n'y a aucun 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 pour minimiser le temps de calcul.
la source
'Magenic'
trouve ailleurs dans l'objetPas besoin de réinventer le
roueboucle, du moins pas explicitement (en utilisant les fonctions fléchées , les navigateurs modernes uniquement ):ou mieux encore :
EDIT: Si vous avez besoin de compatibilité avec les navigateurs moche, alors votre meilleur pari est:
la source
some
peut court-circuiter une fois un objetname === "Magenic"
trouvé. Avecfilter
, il vérifiera chaque élément jusqu'à la fin du tableau et créera un nouveau tableau correspondant à la condition, puis vérifier lelength
Aucune 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", impliquant un résultat booléen. Ce sera vrai s'il y a des objets «magéniques», faux sinon:
Array.prototype.filter ()
Cela retournera un tableau de tous les objets 'Magenic', même s'il n'y en a qu'un (retournera un tableau à un élément):
Si vous essayez de forcer cela à un booléen, cela ne fonctionnera pas, car un tableau vide (pas d'objets «magéniques») est toujours vrai. Il suffit donc de l'utiliser
magenicVendors.length
dans votre conditionnel.Array.prototype.find ()
Cela retournera le premier objet 'Magenic' (ou
undefined
s'il n'y en a pas):Cela aboutit à un accord booléen (tout objet est véridique,
undefined
est faux).Remarque: j'utilise le fournisseur ["Name"] au lieu de vendor.Name en raison de la casse étrange des noms de propriété.
Remarque 2: aucune raison d'utiliser l'égalité lâche (==) au lieu de l'égalité stricte (===) lors de la vérification du nom.
la source
La réponse acceptée fonctionne toujours mais nous avons maintenant une méthode native ECMAScript 6
[Array.find][1]
pour obtenir le même effet.Citant MDN:
Voir mon lien jsfiddle Il y a un polyfill pour IE fourni par mozilla
la source
return ele.id == '2'
, mais +1 pour une bonne solution ES6.push if <0 || splice(index, 1)
voici mon code un peu mis à jour:const index = this.selected.indexOf(this.selected.find(s => s.id == passedObj.id))
Voici comment je le ferais
array.some()
vérifie s'il existe au moins une valeur dans un tableau qui correspond aux critères et renvoie un booléen. A partir de là, vous pouvez aller avec:la source
A moins que vous ne vouliez le restructurer comme ceci:
auquel vous pouvez faire
if(vendors.Magnetic)
Vous devrez boucler
la source
Selon la spécification ECMAScript 6, vous pouvez utiliser
findIndex
.const magenicIndex = vendors.findIndex(vendor => vendor.Name === 'Magenic');
magenicIndex
tiendra soit0
(qui est l'index dans le tableau) ou-1
s'il n'a pas été trouvé.la source
Comme l'OP a posé la question de savoir si la clé existe ou non .
Une solution plus élégante qui retournera booléen en utilisant la fonction de réduction ES6 peut être
Remarque: Le paramètre initial de réduire est a
false
et si le tableau a la clé, il retournera vrai.J'espère que cela aide à une implémentation de code meilleure et plus propre
la source
reduce
est l'accumulateur et non l'vendor
objet. Cela vérifiefalse.Name === "Magenic"
dans chaque boucle et retourne fauxVous ne pouvez pas sans vraiment regarder l'objet.
Vous devriez probablement changer un peu votre structure, comme
Ensuite, vous pouvez simplement l'utiliser comme un hachage de recherche.
la source
Peut-être trop tard, mais le tableau javascript a deux méthodes
some
et uneevery
méthode qui renvoie un booléen et peut vous aider à y parvenir.Je pense que ce
some
serait plus approprié pour ce que vous avez l'intention de réaliser.Certains vérifient que l'un des objets du tableau satisfait à la condition donnée.
Chaque valide que tous les objets du tableau satisfont à la condition donnée.
la source
const array1 = [{name:'Mike'},{name:'Alice'}]; console.log(array1.every(item => item.name !== 'Mike'));
cela devrait retourner vraisome
, mettra à jour ma réponse.Vous devez faire une boucle, il n'y a aucun moyen de contourner cela.
Bien sûr, vous pouvez utiliser une bibliothèque comme linq.js pour rendre cela plus agréable:
(voir jsFiddle pour une démo)
Je doute que linq.js soit plus rapide qu'une boucle directe, mais il est certainement plus flexible lorsque les choses deviennent un peu plus compliquées.
la source
Test des éléments du tableau:
JS propose des fonctions de tableau qui vous permettent d'y parvenir relativement facilement. Ce sont les suivants:
Array.prototype.filter
: Prend une fonction de rappel qui est un test, le tableau est ensuite itéré avec son rappel et filtré en fonction de ce rappel. Un nouveau tableau filtré est renvoyé.Array.prototype.some
: Prend une fonction de rappel qui est un test, le tableau est ensuite itéré avec son rappel et si un élément réussit le test, le booléen true est retourné. Sinon, false est retournéLes détails sont mieux expliqués via un exemple:
Exemple:
Prise en charge du navigateur:
Ces 2 fonctions sont
ES6
fonctionnelles, tous les navigateurs peuvent ne pas les supporter. Pour surmonter cela, vous pouvez utiliser un polyfill. Voici le polyfill pourArray.prototype.some
(de MDN):la source
si vous utilisez jquery, vous pouvez profiter de grep pour créer un tableau avec tous les objets correspondants:
puis utilisez le tableau de résultats:
la source
Corrigez-moi si je me trompe .. j'aurais pu utiliser une
forEach
méthode comme celle-ci,De nos jours, j'y suis habitué, à cause de sa simplicité et de son mot explicatif. Je vous remercie.
la source
Vous pouvez essayer son travail pour moi.
la source
Vous pouvez utiliser lodash . Si la bibliothèque lodash est trop lourde pour votre application, envisagez de supprimer les fonctions inutiles non utilisées.
Ce n'est qu'une façon de procéder. Un autre peut être:
console.log(arr);
L'exemple ci-dessus peut également être réécrit sans utiliser de bibliothèques comme:
J'espère que ma réponse vous aidera.
la source
De nombreuses réponses ici sont bonnes et assez faciles. Mais si votre tableau d'objets a un ensemble de valeurs fixe, vous pouvez utiliser l'astuce ci-dessous:
Mappez tout le nom dans un objet.
Maintenant, ce dirtyObj vous pouvez utiliser encore et encore sans boucle.
la source
Pour comparer un objet à un autre, je combine une boucle for in (utilisée pour parcourir les objets) et some (). Vous n'avez pas à vous soucier d'un tableau qui sort des limites, etc., ce qui permet d'économiser du code. La documentation sur .some peut être trouvée ici
Une autre façon de comparer un objet à un autre est d'utiliser une boucle imbriquée pour avec Object.keys (). Length pour obtenir la quantité d'objets dans le tableau. Code ci-dessous:
Pour répondre à votre question exacte, si vous recherchez simplement une valeur dans un objet, vous pouvez utiliser une seule boucle for in.
la source
Vous pouvez également faire:
la source
var without2 = (arr, args) => arr.filter(v => v.id !== args.id);
Exemple:without2([{id:1},{id:1},{id:2}],{id:2})
Résultat: without2 ([{id: 1}, {id: 1}, {id: 2}], {id: 2})
la source
la source
Mon approche pour résoudre ce problème consiste à utiliser ES6 et à créer une fonction qui effectue la vérification pour nous. L'avantage de cette fonction est qu'elle peut être réutilisable tout au long de votre projet pour vérifier n'importe quel tableau d'objets étant donné le
key
et levalue
à vérifier.ASSEZ PARLER, VOYONS LE CODE
Array
Une fonction
Appel / Utilisation
la source
Je préfère aller avec regex.
Si votre code est le suivant,
je recommanderais
la source