4
votes

Comment vérifier si l'objet est vide en javascript pour tous les niveaux de l'objet

Je voulais savoir si mon objet est vide ou non pour tous ses objets imbriqués et paires clé-valeur.

par exemple,

const x = {
  a:"",
  b:[],
  c:{
    x:[]
  },
  d:{
    x:{
      y:{
        z:""
      }
    }
  }
};

cela devrait être un objet vide et si l'un de ces éléments contient une seule valeur, il doit être non vide.


1 commentaires

Pourriez-vous nous montrer ce que vous avez essayé?


4 Réponses :


4
votes

Voici comment faire quoi que ce soit en utilisant recursion convenient

const x = {
  a:"",
  b:[],
  c:{
    x:[]
  },
  d:{
    x:{
      y:{
        z:''
      }
    }
  }
};
function checkEmpty(obj){
  
  for(let key in obj){
    //if the value is 'object'
    if(obj[key] instanceof Object === true){
      if(checkEmpty(obj[key]) === false) return false;
    }
    //if value is string/number
    else{
      //if array or string have length is not 0.
      if(obj[key].length !== 0) return false;
    }
  }
  return true;
}
console.log(checkEmpty(x))
x.d.x.y.z = 0;
console.log(checkEmpty(x));


1 commentaires

il fonctionne parfaitement dans toutes les conditions, merci mec! vous avez bien compris 0 n'est nul nulle part ici pour mon cas.



1
votes

Vous pouvez écrire une fonction récursive comme suit. La fonction crée un ensemble avec 2 valeurs possibles true et false. Si la taille de l'ensemble est 1 et que la valeur est false, cela signifie que l'objet est vide.

const x = {a:"",b:[],c:{x:[]},d:{x:{y:{z:""}}}};

function isEmpty(o, r = new Set()) {
  for (let k in o) {
    if(typeof o[k] === "object") {
      if(Array.isArray(o[k])) r.add(!!o[k].length);
      else isEmpty(o[k],r);
    } else r.add(!(o[k] === "" || o[k] === undefined || o[k] === null));
  }
  return r;
}
let result = isEmpty(x);

console.log(result.has(false) && result.size == 1);


1 commentaires

Il retourne vrai pour 0 à l'intérieur de l'objet



1
votes

J'utiliserai une approche récursive pour celle-ci, nous itérons sur object.keys () et vérifions si chaque valeur liée à la clé est vide, dans le cas où la valeur est un objet, nous allons un niveau plus loin pour le vérifier.

const x = {
  a:"",
  b:[],
  c:{x:[]},
  d:{x:{y:{z:""}}}
};

const x1 = [0,0,0];
const x2 = {0:0,1:0,2:0};

const isEmpty = (obj, empty=true) =>
{
    Object.keys(obj).forEach((key) =>
    {
        if (typeof obj[key] === "object")
            empty = isEmpty(obj[key], empty);
        else
            empty = empty && (obj[key].length === 0);
            
        // Return early if we detect empty here.
        
        if (!empty) return empty;
    });
    
    return empty;
}

console.log("original x: ", isEmpty(x));

x.a = "I'm not empty";

console.log("x after edit: ", isEmpty(x));
console.log("x1: ", isEmpty(x1));
console.log("x2: ", isEmpty(x2));


5 commentaires

Votre code renverra true même s'il y aura une valeur 0


@MaheerAli Je ne comprends vraiment pas bien ce qu'il considère comme vide, dans son exemple ce {z: ""} est considéré comme vide. Pour moi, ce n'est pas vide. S'il clarifie avec d'autres cas, je mettrai à jour la réponse, mais l'approche sera similaire. Pourriez-vous me donner un exemple où mon code échoue, afin que je puisse l'analyser ...


utilisez x.a = 0; puis vérifiez qu'il renverra true


Par exemple, sera-ce un objet vide [0,0,0] ou non? Si non, alors {0: 0, 1: 0, 2: 0} ne doit pas être considéré comme vide également.


ni [0,0,0] ne doit être considéré comme vide ni {0: 0, 1: 0, 2: 0} . Dans sa question, il n'a montré que [] et ''