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.
4 Réponses :
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));
il fonctionne parfaitement dans toutes les conditions, merci mec! vous avez bien compris 0 n'est nul nulle part ici pour mon cas.
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);
Il retourne vrai
pour 0
à l'intérieur de l'objet
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));
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 ''
essayez (nous utilisons ici récursivité , grosse flèche , obj. keys , réduire , opérateur ternaire et vérification d'objets ) const x = {
a:"",
b:[],
c:{
x:[]
},
d:{
x:{
y:{
z:""
}
}
}
};
let isEmpty = o => o.constructor.name === "Object" ?
Object.keys(o).reduce((y,z)=> y&&isEmpty(o[z]) ,true) : o.length == 0;
// Test
console.log(isEmpty(x));
x.d.x.y.z="Smile to life and life will smile to you";
console.log(isEmpty(x));
let isEmpty = o => o.constructor.name === "Object" ?
Object.keys(o).reduce((y,z)=> y&&isEmpty(o[z]) ,true) : o.length == 0;
Pourriez-vous nous montrer ce que vous avez essayé?