Existe-t-il une méthode ou une chaîne de méthodes pour vérifier si un tableau de clés existe dans un objet disponible dans lodash, plutôt que d'utiliser les éléments suivants?
var params = {...}
var isCompleteForm = true;
var requiredKeys = ['firstname', 'lastname', 'email']
for (var i in requiredKeys) {
if (_.has(params, requiredKeys[i]) == false) {
isCompleteForm = false;
break;
}
}
if (isCompleteForm) {
// do something fun
}
[~ # ~] mise à jour [~ # ~]
Merci à tous pour les solutions géniales! Si vous êtes intéressé, voici le jsPerf des différentes solutions.
Vous pouvez devenir totalement fonctionnel, avec les fonctions every
, has
et partial
, comme ça
var requiredKeys = ['firstname', 'lastname', 'email'],
params = {
"firstname": "thefourtheye",
"lastname": "thefourtheye",
"email": "NONE"
};
console.log(_.every(requiredKeys, _.partial(_.has, params)));
// true
Nous passons un objet de fonction partielle à _.every
, qui est en fait _.has
partiellement appliqué à params
objet. _.every
itérera requiredKeys
tableau et passera la valeur actuelle à l'objet partiel, qui appliquera la valeur actuelle au partiel _.has
fonction et renverra true
ou false
. _.every
renverra true
uniquement si tous les éléments du tableau renvoient true
lorsqu'ils sont passés à l'objet fonction. Dans l'exemple que j'ai montré ci-dessus, puisque toutes les clés sont dans params
, il retourne true
. Même si un seul élément n'est pas présent, il retournera false
.
Je sais que la question concerne le lodash, mais cela peut être fait avec Vanilla JS, et c'est beaucoup plus rapide:
requiredKeys.every(function(k) { return k in params; })
et encore plus propre dans ES2015:
requiredKeys.every(k => k in params)
_(requiredKeys).difference(_(params).keys().value()).empty()
Je crois. L'étape clé consiste à tout mettre en tableaux puis à travailler avec des ensembles.
ou
_requiredKeys.map(_.pluck(params).bind(_)).compact().empty()
Pourrait fonctionner.
En supposant que les paramètres peuvent avoir plus de propriétés que nécessaire ...
var keys = _.keys(params);
var isCompleteForm = requiredKeys.every(function (key) {
return keys.indexOf(key) != -1;
});
Devrait faire l'affaire.