2015-10-07 3 views
-2

Je commencerai par dire, je comprends qu'il y a beaucoup de manières de faire ceci. Cette question est un effort pour comparer différentes versions.Comment vérifier un objet contient un ensemble de propriétés

Je comprends aussi que nous cherchons à être un site d'assurance qualité, pas un site QAAAAAAA ....

Je vais donc affiner la question pour la rendre plus ciblée et aboutir à une réponse.

un objet Étant donné:

var obj = {a: 1, b: 2, c: 3};

savoir si les touches suivantes sont présentes:

var keys = ['a', 'b', 'c', 'd']; // 'd' would be flagged although a boolean would suffice

Idéalement, je voudrais le faire dans ES5, mais ES6 est plus que bienvenue.

Idéalement sans l'utilisation de lodash, mais il est plus que bienvenu.

Je suis sûr qu'il ya une belle combinaison des indigènes méthodes Array qui va travailler:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find

L'objectif est d'avoir une fonction ou d'une ligne de code qui est petit et concis plutôt que quelque chose comme :

var obj = {a: 1, b: 2, c: 3}; 
var keys = ['a', 'b', 'c', 'd']; 
var found = keys.length; 
for (var i = 0; i < keys.length; i++) { 
    if (obj.hasOwnProperty(keys[i])) { 
    found--; 
    } 
} 
console.log("Missing:", found); 

Je patauge avec la première offre:

var obj = {a: 1, b: 2, c: 3}; 
var keys = ['a', 'b', 'c', 'd']; 

var allPresent = Object.keys(obj).filter(function(item) { 
    return keys.indexOf(item) !== -1; 
}).length === keys.length; 

console.log("All present:", allPresent); 
+0

Essayez '_.difference' dans lodash – thefourtheye

+1

' Object.keys (obj) .filter (e => keys.indexOf (item)! == -1); ' – Tushar

+1

Si J'ai retiré ma tentative et fait semblant de ne pas savoir comment le faire, aurait-il encore besoin de passer à CR? –

Répondre

3

Comme ceci:

var obj = {a: 1, b: 2, c: 3}; 
 
var keys = ['a', 'b', 'c', 'd']; 
 

 
alert(keys.every(Object.prototype.hasOwnProperty, obj))

-1

objet donné:

var obj = {a: 1, b: 2, c: 3}, 
    keys = ['a','b']; 

Vous pouvez vérifier si elle contient la clé « a » à l'aide:

Object.keys(obj).indexOf('a') !== -1 

Merci pour les commentaires ici est une réponse complète pour vérifier ce que l'OP a demandé pour l'égalité complète:

JSON.stringify(Object.keys(obj)) === JSON.stringify(keys) 

Ou l'égalité partielle

JSON.stringify(Object.keys(obj)).indexOf(JSON.stringify(keys)) !== -1 
+0

pourquoi faudrait-il descendre pour cela – guramidev

+1

Bien que je ne vous ai pas downvote, pour obtenir le résultat demandé, vous devez toujours utiliser une boucle, qui est identique au dernier exemple donné par l'OP. – Shilly

+0

merci les gars j'ai raté le point mon mauvais, j'ai édité la réponse si – guramidev

0
allPresent = keys.reduce(function (acc, next) { 
    return !acc || obj.hasOwnProperty(next); 
}, true); 

Bien que Amits réponse est probablement encore plus petit et plus pratique pour les navigateurs qui prennent en charge 'tous'. (devrait être tous maintenant)

+0

'Array.prototype.every' surpasse' Array.prototype.reduce' et est pris en charge dans une base installée plus importante (insignifiante) (JS1.6 vs JS1.8). – Amit

+1

Oh génial, merci! Je ne le savais pas. Pour une raison quelconque, je pensais que tout a été ajouté quand ils ont ajouté trouver. Mais MDN sait tout. :) – Shilly