Supprimer les valeurs vides et nulles de l'objet imbriqué (ES6) - Nettoyer les objets imbriqués
J'ai un objet qui ressemble à ceci:
{
"a": "string not empty",
"b": {
"c": "string not empty",
},
"d": {
"e": false,
"f": 0,
"g": true,
"h": 10
},
"i": {
"j": 0,
"k": null
},
"l": {
"m": null
},
"n": {
"o": 1,
"p": "string (not empty)",
"q": {}
},
"r": [],
"l": "2000-01-01T01:01:00.000Z",
}
Grâce au code fourni par ici: https://stackoverflow.com/a/38364486/3912805 je peux maintenant supprimer toutes les null
valeurs de mon objet imbriqué.
J'ai utilisé cette fonction jusqu'à présent pour removeNull
:
removeNull = (obj) => {
Object.keys(obj).forEach(key =>
(obj[key] && typeof obj[key] === 'object') && removeNull(obj[key]) ||
(obj[key] === undefined || obj[key] === null) && delete obj[key]
);
return obj;
};
Mais je voudrais améliorer cette fonction pour me permettre de supprimer tous les tableaux vides ou toute collection vide qui peut exister dans mon objet imbriqué.
Les résultats finaux devraient être sans k
, l
et m
, q
, r
, l
:
{
"a": "string not empty",
"b": {
"c": "string not empty",
},
"d": {
"e": false,
"f": 0,
"g": true,
"h": 10
},
"i": {
"j": 0
},
"n": {
"o": 1,
"p": "string (not empty)"
},
"l": "2000-01-01T01:01:00.000Z",
}
Je dois conserver toutes les valeurs définies sur 0
ou sur false
.
Je voudrais améliorer cette removeNull
méthode en utilisant la méthode ES6, mais jusqu'à présent je n'ai pas réussi à le faire.
J'ai également essayé la méthode de la vieille école qui a été utilisée pour cela Comment supprimer profondément les valeurs nulles, les objets vides et le tableau vide d'un objet
itemToBool = item => {
if (typeof item !== 'object' || item === null) return item;
const cleanedItem = cleanObject(item);
return Object.keys(cleanedItem).length !== 0 && cleanedItem;
};
cleanObject = obj => {
if (Array.isArray(obj)) {
const newArr = obj.map(itemToBool).filter(Boolean);
return newArr.length && newArr;
}
const newObj = Object.entries(obj).reduce((a, [key, val]) => {
const newVal = itemToBool(val);
if (newVal !== null || newVal === false) a[key] = newVal;
return a;
}, {});
return Object.keys(newObj).length > 0 && newObj;
};
mais cela échoue aussi.
Vous pouvez adopter une approche simple en itérant les paires clé / valeur de l'objet et en itérant d'abord les objets itérables imbriqués, puis en supprimant les clés indésirables.
function clean(object) {
Object
.entries(object)
.forEach(([k, v]) => {
if (v && typeof v === 'object') {
clean(v);
}
if (v && typeof v === 'object' && !Object.keys(v).length || v === null || v === undefined) {
if (Array.isArray(object)) {
object.splice(k, 1);
} else {
delete object[k];
}
}
});
return object;
}
var object = { a: "string not empty", b: { c: "string not empty" }, d: { e: false, f: 0, g: true, h: 10 }, i: { j: 0, k: null }, l: { m: null }, n: { o: 1, p: "string (not empty)", q: {} }, r: [{ foo: null }] };
console.log(clean(object));
.as-console-wrapper { max-height: 100% !important; top: 0; }