web-dev-qa-db-ja.com

すべてのオブジェクトキーに偽の値があるかどうかを確認する方法

JSオブジェクト:

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

問題は、すべての値がfalse?であるかどうかを確認する方法です。

$ .each()jQuery関数といくつかのフラグ変数を使用できますが、より良い解決策がありますか?

20
avkryukov

これはトリックを行います...

var result = true;

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

ループを使用して、インデックスまたはキー(上記のように)を使用してオブジェクトを反復できます。

きちんとしたコードを求めていて、それを繰り返さない場合は、単に関数に入れてください...

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

次に、このように、必要なときにいつでも呼び出すことができます...

alert(saver.allFalse());

これが実際のサンプルです...

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());
19
Archer

これは、JavaScript 1.8.5を必要とする非常にシンプルなソリューションです。

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

例:

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

あるいは、あなたは書くことができます

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

詳細については、 Mozilla Developer Network Object.keys()のリファレンス を参照してください。

17
MattClimbs

コメントでは、繰り返しを避けることができるかどうかを尋ねます。 nderscoreLodash 、または Sugar などの機能的アプローチをサポートするjavascriptライブラリを使用することができます。

アンダースコアとLodashを使用すると、次のように記述できます。

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

Sugarを使用すると、次のように簡単に記述できます。

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

やりたい場合外部反復なし(つまりコード内)、プロパティを_$.map_を使用して配列にマッピングしてから、_$.inArray_を使用して真の値が存在するかどうかを確認します。 :

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

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

1
Gone Coding

Lodashでは、const allFalse = !_.some(saver);も実行できます。

1
ngstschr

Lodash(3.10.1+)は、これをさらに明確にして明示的に表現します。

_.every({a: false, b: false, c: false}, _.negate(Boolean)); // True

しかし、_.some per ngstschr's answer の方が簡潔です。

0
xlm

こうやって

 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

短くて便利なワンライナー、ブラウザーで完全にサポート:

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

または

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

(注意tho、 Object.values()[〜#〜] ie [〜#〜]ではまだサポートされていません)

0
theVoogie

Lodash 4.0以降、 overEvery を使用できます

overEvery(saver, false)はすべての要素をループし、そのfalseかどうかを確認します

すべての要素がtrueの場合はfalseを返し、そうでない場合はfalseを返します

0
deadcoder0904