web-dev-qa-db-fra.com

Comment puis-je vérifier si un JSON est vide dans NodeJS?

J'ai une fonction qui vérifie si une requête contient des requêtes et effectue différentes actions en fonction de celle-ci. Actuellement, j'ai if(query) faire ceci autre chose. Cependant, il semble que lorsqu'il n'y a pas de données de requête, je me retrouve avec un objet JSON {}. En tant que tel, je dois remplacer if(query) par if(query.isEmpty()) ou quelque chose de ce genre. Quelqu'un peut-il expliquer comment je pourrais y arriver dans NodeJS? L'objet JSON V8 possède-t-il une fonctionnalité de ce type?

33
thisissami

Vous pouvez utiliser l'une ou l'autre de ces fonctions:

// This should work in node.js and other ES5 compliant implementations.
function isEmptyObject(obj) {
  return !Object.keys(obj).length;
}

// This should work both there and elsewhere.
function isEmptyObject(obj) {
  for (var key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      return false;
    }
  }
  return true;
}

Exemple d'utilisation:

if (isEmptyObject(query)) {
  // There are no queries.
} else {
  // There is at least one query,
  // or at least the query object is not empty.
}
73
PleaseStand

Vous pouvez utiliser ceci:

var isEmpty = function(obj) {
  return Object.keys(obj).length === 0;
}

ou ca:

function isEmpty(obj) {
  return !Object.keys(obj).length > 0;
}

Vous pouvez aussi utiliser ceci:

function isEmpty(obj) {
  for(var prop in obj) {
    if(obj.hasOwnProperty(prop))
      return false;
  }

  return true;
}

Si vous utilisez underscore ou jQuery , vous pouvez utiliser leurs appels isEmpty ou isEmptyObject.

25
ali haider
Object.keys(myObj).length === 0;

Comme il est juste nécessaire de vérifier si Object est vide, il sera préférable d'appeler directement une méthode native Object.keys (myObj) .length qui retourne le tableau de clés en itérant en interne avec for..in loop.As Object.hasOwnProperty renvoie un booléen résultat basé sur la propriété présente dans un objet qui itère lui-même avec la boucle for..in et qui aura une complexité temporelle O (N2).

Appeler un fichier UDF qui a lui-même plus de deux implémentations ou autre fonctionnera bien pour un petit objet mais bloquera le code, ce qui aura un impact important sur la performance globale si la taille de l'objet est grande, à moins que rien ne soit en attente dans la boucle d'événements.

3
Shubham Sharma

Si vous avez une compatibilité avec Object.keys et que le noeud en a une, vous devez l’utiliser à coup sûr. 

Cependant, si vous n'avez pas de compatibilité et que, pour une raison quelconque, l'utilisation d'une fonction de boucle est hors de question, comme moi, j'ai utilisé la solution suivante: 

JSON.stringify(obj) === '{}'

Considérez cette solution comme une utilisation «en dernier recours» uniquement si elle est indispensable. 

Voir dans les commentaires "il existe de nombreuses façons pour lesquelles cette solution n'est pas idéale". 

J'avais un scénario de dernier recours et cela fonctionnait parfaitement. 

2
guy mograbi

Ma solution:

let isEmpty = (val) => {
    let typeOfVal = typeof val;
    switch(typeOfVal){
        case 'object':
            return (val.length == 0) || !Object.keys(val).length;
            break;
        case 'string':
            let str = val.trim();
            return str == '' || str == undefined;
            break;
        case 'number':
            return val == '';
            break;
        default:
            return val == '' || val == undefined;
    }
};
console.log(isEmpty([1,2,4,5])); // false
console.log(isEmpty({id: 1, name: "Trung",age: 29})); // false
console.log(isEmpty('TrunvNV')); // false
console.log(isEmpty(8)); // false
console.log(isEmpty('')); // true
console.log(isEmpty('   ')); // true
console.log(isEmpty([])); // true
console.log(isEmpty({})); // true
0
Trung Nguyên