Как проверить, имеют ли все ключи объекта ложные значения
Объект 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;
Ответ 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 является более кратким.