objetos - recorrer objeto json javascript
cómo comprobar si todas las claves de objeto tienen valores falsos (8)
A partir de Lodash 4.0, overEvery puede ser usado
overEvery(saver, false)
recorre cada elemento y verifica si es false
Devuelve true
si cada elemento es false
contrario devuelve false
Objeto JS:
var saver = {
title: false,
preview: false,
body: false,
bottom: false,
locale: false
};
La pregunta es ¿cómo comprobar si todos los valores son falsos ?
Puedo usar la función jQuery de $ .each () y alguna variable de marca, pero ¿puede haber una solución mejor?
Con lodash también puedes hacer const result = _.some(saver);
Corto y práctico de una sola línea, totalmente compatible con los navegadores:
Object.keys(saver).every(k => saver[k] === false);
o
Object.values(saver).every(v => v === false);
(aunque cuidado, Object.values() no es compatible con IE todavía).
En un comentario preguntas si puedes evitar la iteración. Puede hacerlo si utiliza una biblioteca javascript que admita un enfoque funcional, como Underscore , Lodash o Sugar .
Con Underscore y Lodash puedes escribir algo como esto:
var result = _.every(_.values(saver), function(v) {return !v;});
Con Sugar simplemente puedes escribir:
var result = Object.all(saver,false);
Esta es una solución muy simple que requiere JavaScript 1.8.5.
Object.keys(obj).every((k) => !obj[k])
Ejemplos:
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
Alternativamente podrías escribir
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
Consulte la referencia de Mozilla Developer Network Object.keys () para obtener más información.
Esto hará el truco ...
var result = true;
for (var i in saver) {
if (saver[i] === true) {
result = false;
break;
}
}
Puede iterar objetos usando un bucle, ya sea por índice o por clave (como arriba).
Si buscas un código ordenado, y no lo repites, simplemente ponlo en una función ...
Object.prototype.allFalse = function() {
for (var i in this) {
if (this[i] === true) return false;
}
return true;
}
Entonces puedes llamarlo cuando lo necesites, así ...
alert(saver.allFalse());
Aquí hay una muestra de trabajo ...
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());
Hazlo así,
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
Si desea hacerlo sin una iteración externa (es decir, en su código), intente asignar las propiedades a una matriz con $.map
luego use $.inArray
para ver si existe algún valor verdadero:
var allFalse = $.inArray(true, $.map(saver, function(obj){return obj})) < 0;