web-dev-qa-db-fra.com

Déterminer si tous les attributs d'un objet javascript sont nuls ou une chaîne vide

Quel est le moyen le plus élégant de déterminer si tous les attributs d'un objet javascript sont nuls ou la chaîne vide? Cela devrait fonctionner pour un nombre arbitraire d'attributs.

{'a':null, 'b':''} //should return true for this object
{'a':1, 'b':''} //should return false for this object
{'a':0, 'b':1} //should return false
{'a':'', 'b':''} //should return true
20
J-bob

Créez une fonction à boucler et vérifiez:

function checkProperties(obj) {
    for (var key in obj) {
        if (obj[key] !== null && obj[key] != "")
            return false;
    }
    return true;
}

var obj = {
    x: null,
    y: "",
    z: 1
}

checkProperties(obj) //returns true
18
tymeJV

Réponse 2017: Vérifiez toutes les valeurs avec Object.values ​​(). Retourne un tableau avec les valeurs que vous pouvez vérifier avec Array.every () ou Array.some () ... etc.

const isEmpty = Object.values(object).every(x => (x === null || x === ''));
25
PVermeer

Voici ma version, vérifiant spécifiquement les chaînes nulles et vides (il serait plus facile de simplement vérifier la fausseté)

function isEmptyObject(o) {
    return Object.keys(o).every(function(x) {
        return o[x]===''||o[x]===null;  // or just "return o[x];" for falsy values
    });
}
18
adeneo

Vous pouvez utiliser le prototype Array.reduce sur les clés de votre objet.

En supposant que l'objet est structuré comme suit:

var obj = {
    x: null,
    y: "",
    z: 1
}

vous pouvez utiliser l'instruction suivante pour déterminer si toutes ses propriétés sont non définies ou définies sur chaîne vide à l'aide d'une seule ligne:

Object.keys(obj).reduce((res, k) => res && !(!!obj[k] || obj[k] === false || !isNaN(parseInt(obj[k]))), true) // returns false

Si vous souhaitez découvrir si toutes ses propriétés sont définies à la place, vous devez supprimer la négation avant les conditions et définir la valeur du résultat initial sur true uniquement si l'objet a des clés:

Object.keys(obj).reduce((res, k) => res && (!!obj[k] || obj[k] === false || !isNaN(parseInt(obj[k]))), Object.keys(obj).length > 0) // returns false as well
6
whirmill

Complétez simplement les réponses précédentes: elles fonctionneront si votre objet ne contient pas de tableaux ou d'objets. Si tel est le cas, vous devrez effectuer une «vérification approfondie».

Alors je suis venu avec cette solution. Il évaluera l'objet comme vide si all ses valeurs (et ses valeurs à l'intérieur des valeurs) sont undefined, {} ou [].

function deepCheckEmptyObject(obj) {
    return Object.values(obj).every( value => {
        if (value === undefined) return true;
        else if ((value instanceof Array || value instanceof Object) && _.isEmpty(value) ) return true;
        else if (value instanceof Array && !_.isEmpty(value)) return deepCheckEmptyArray(value);
        else if (value instanceof Object && !_.isEmpty(value)) return deepCheckEmptyObject(value);
        else return false;
    });
}

function deepCheckEmptyArray(array) {
    return array.every( value => {
        if (value === undefined) return true;
        else if ((value instanceof Array || value instanceof Object) && _.isEmpty(value)) return true;
        else if (value instanceof Array && !_.isEmpty(value)) return deepCheckEmptyArray(value);
        else if (value instanceof Object && !_.isEmpty(value)) return deepCheckEmptyObject(value);
        else return false;
    });
}

Notez que la fonction .isEmpty() de Lodash est utilisée pour effectuer le travail pénible après avoir «isolé» une valeur. Ici, Lodash est importé en tant que '_'.

J'espère que ça aide!

1
Bruno Ribeiro

Sur la base de la réponse d’adeneo, j’ai créé une condition de ligne unique. J'espère que cela sera utile à quelqu'un.

var test = {
  "email": "[email protected]",
  "phone": "1234567890",
  "name": "Test",
  "mobile": "9876543210",
  "address": {
      "street": "",
      "city": "",
      "state": "",
      "country": "",
      "postalcode": "r"
  },
  "website": "www.test.com"
};

if (Object.keys(test.address).every(function(x) { return test.address[x]===''||test.address[x]===null;}) === false) {
   console.log('has something');
} else {
   console.log('nothing');
}

Vous pouvez le tester https://jsfiddle.net/4uyue8tk/2/

1
ajilpm

Ceci ignore l'attribut de fonction

function checkIsNull(obj){
		let isNull=true;
		for(let key in obj){
			if (obj[key] && typeof obj[key] !== 'function') {
				isNull = false;
			}
		}
		return isNull;
	}

var objectWithFunctionEmpty={
  "name":undefined,
  "surname":null,
  "fun": function (){ alert('ciao'); }
}

var objectWithFunctionFull={
  "name":undefined,
  "surname":"bla bla",
  "fun": function (){ alert('ciao'); }
}

checkIsNull(objectWithFunctionEmpty); //true
checkIsNull(objectWithFunctionFull); //false

0
Alessandro

En me basant sur d’autres réponses, j’utiliserais lodash pour vérifier isEmpty sur l’objet, ainsi que ses propriétés.

const isEmpty = (object) => return _.isEmpty(object) || !Object.values(object).some(x => !_.isEmpty(x))
0
mkapiczy

Basé sur la réponse de tymeJv =)

function checkProperties(obj) {
var state = true;
  for (var key in obj) {
    if ( !( obj[key] === null || obj[key] === "" ) ) {
        state = false;
        break;
    }
  }
  return state;
}

var obj = {
  x: null,
  y: "",
  z: 1
}

checkProperties(obj) //returns false

J'espère que ça aide =)

0
Luis García