Как проверить, имеют ли все ключи объекта ложные значения

Объект JS:

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

Вопрос в том, как проверить, соответствуют ли все значения false?

Я могу использовать функцию $.each() jQuery и некоторую переменную флага, но может быть лучшее решение?

Ответ 1

Это сделает свое дело...

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

Ответ 2

В комментарии вы спрашиваете, можете ли вы избежать итерации. Вы можете использовать библиотеку javascript, поддерживающую функциональный подход, например Underscore, Lodash или Sugar.

С Underscore и Lodash вы можете написать что-то вроде этого:

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

С Sugar вы можете просто написать:

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

Ответ 3

Это очень простое решение, требующее 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() для получения дополнительной информации.

Ответ 4

Если вы хотите сделать это без внешней итерации (т.е. в вашем коде), попробуйте сопоставить свойства массиву с помощью $.map, а затем с помощью $.inArray, чтобы увидеть, существуют ли какие-либо истинные значения:

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

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

Ответ 5

С lodash вы также можете сделать const allFalse = !_.some(saver);

Ответ 6

Сделайте это,

 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

Ответ 7

Начиная с Lodash 4.0, overEvery можно использовать

overEvery(saver, false) проходит через каждый элемент и проверяет, не находится ли его false

Он возвращает true, если каждый элемент false в противном случае возвращает false

Ответ 8

Короткий и удобный однострочный текст, полностью поддерживаемый браузерами:

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

или же

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

(осторожно, Object.values() пока не поддерживается IE.)

Ответ 9

Лодаш (3.10. 1+) делает это еще чище, чтобы выразить явно:

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

Но использование _.some для ответа ngstschr является более кратким.