web-dev-qa-db-fra.com

comment vérifier si toutes les clés d'objet ont de fausses valeurs

Objet JS:

var saver = {
        title: false,
        preview: false,
        body: false,
        bottom: false,
        locale: false
};

La question est de savoir comment vérifier si toutes les valeurs sont false ?

Je peux utiliser la fonction $ .each () jQuery et une variable de drapeau, mais il pourrait y avoir une meilleure solution? 

16
avkryukov

Ça fera l'affaire...

var result = true;

for (var i in saver) {
    if (saver[i] === true) {
        result = false;
        break;
    }
}

Vous pouvez itérer des objets à l'aide d'une boucle, par index ou par clé (comme ci-dessus).

Si vous recherchez un code ordonné et ne le répétez pas, mettez-le simplement dans une fonction ...

Object.prototype.allFalse = function() { 
    for (var i in this) {
        if (this[i] === true) return false;
    }
    return true;
}

Ensuite, vous pouvez l'appeler quand vous avez besoin, comme ça ...

alert(saver.allFalse());

Voici un échantillon de travail ...

Object.prototype.allFalse = function() { 
    for (var i in this) {
        if (this[i] === true) return false;
    }
    return true;
}

var saver = {
        title: false,
        preview: false,
        body: false,
        bottom: false,
        locale: false
};

console.log("all are false - should alert 'true'");
console.log(saver.allFalse());

saver.body = true;

console.log("one is now true - should alert 'false'");
console.log(saver.allFalse());

18
Archer

Dans un commentaire, vous demandez si vous pouvez éviter les itérations. Vous pouvez utiliser une bibliothèque javascript prenant en charge une approche fonctionnelle, telle que Underscore , Lodash ou Sugar .

Avec Underscore et Lodash, vous pouvez écrire quelque chose comme ceci: 

var result = _.every(_.values(saver), function(v) {return !v;});

Avec Sugar, vous pouvez simplement écrire:

var result = Object.all(saver,false);
16
andersh

C'est une solution très simple qui nécessite JavaScript 1.8.5.

Object.keys(obj).every((k) => !obj[k])

Exemples:

obj = {'a': true, 'b': true}
Object.keys(obj).every((k) => !obj[k]) // returns false

obj = {'a': false, 'b': true}
Object.keys(obj).every((k) => !obj[k]) // returns false

obj = {'a': false, 'b': false}
Object.keys(obj).every((k) => !obj[k]) // returns true

Sinon, vous pouvez écrire

Object.keys(obj).every((k) => obj[k] == false)
Object.keys(obj).every((k) => obj[k] === false)  // or this
Object.keys(obj).every((k) => obj[k])  // or this to return true if all values are true

Consultez la référence de Mozilla Developer Network Object.keys () pour plus d'informations.

14
MattClimbs

Si vous voulez le faire sans itération externe (c'est-à-dire dans votre code), essayez de mapper les propriétés sur un tableau avec $.map, puis utilisez $.inArray pour voir s'il existe des valeurs vraies:

var allFalse = $.inArray(true, $.map(saver, function(obj){return obj})) < 0;

JSFiddle: http://jsfiddle.net/TrueBlueAussie/FLhZL/1/

1
Gone Coding

Fait comme ça,

 for (var i in saver) {
  if (saver[i]) {
    return false; // here if any value is true it wll return as false /
  }
 }
 return true; //here if all value is false it wll return as true
0
Balachandran

One-Liner court et pratique, entièrement pris en charge par les navigateurs:

Object.keys(saver).every(k => saver[k] === false);

ou

Object.values(saver).every(v => v === false);

(Attention, Object.values ​​() n'est pas encore supporté par IE.)

0
voogieJames

À partir de Lodash 4.0, overEvery peut être utilisé

overEvery(saver, false) parcourt chaque élément et vérifie si sa false

Il retourne true si chaque élément est false sinon retourne false

0
deadcoder0904