web-dev-qa-db-fra.com

LoDash _.has pour plusieurs clés

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.

http://jsperf.com/check-array-of-keys-for-object

24
YarGnawh

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.

27
thefourtheye

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)
42
Allan Baptista
_(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.

3
djechlin

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.

2
irysius