it-swarm.com.ru

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

Объект JS:

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

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

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

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

18
Archer

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

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

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

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

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

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

14
MattClimbs

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

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

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

1
Gone Coding

Делай так,

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

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

0
voogieJames

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

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

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

0
deadcoder0904