Existe-t-il un moyen propre de supprimer les champs non définis d'un objet?
c'est à dire.
> var obj = { a: 1, b: undefined, c: 3 }
> removeUndefined(obj)
{ a: 1, c: 3 }
Je suis tombé sur deux solutions:
_.each(query, function removeUndefined(value, key) {
if (_.isUndefined(value)) {
delete query[key];
}
});
ou:
_.omit(obj, _.filter(_.keys(obj), function(key) { return _.isUndefined(obj[key]) }))
One-Liner utilisant ES6 fonction de flèche et opérateur ternaire:
Object.keys(obj).forEach(key => obj[key] === undefined ? delete obj[key] : '');
Ou utilisez court-circuit évaluation au lieu de ternaire: (@Matt Langlois, merci pour l'info!)
Object.keys(obj).forEach(key => obj[key] === undefined && delete obj[key])
Même exemple avec if expression:
Object.keys(obj).forEach(key => {
if (obj[key] === undefined) {
delete obj[key];
}
});
Si vous souhaitez supprimer null
, ''
et undefined
, utilisez !obj[key]
au lieu de obj[key] === undefined
.
Si vous souhaitez également supprimer les éléments des objets imbriqués, vous pouvez utiliser une fonction récursive :
const removeEmpty = (obj) => {
Object.keys(obj).forEach(key => {
if (obj[key] && typeof obj[key] === 'object') removeEmpty(obj[key]);
else if (obj[key] === undefined) delete obj[key];
});
return obj;
};
var obj = { a: 1, b: undefined, c: 3 }
Pour supprimer undefined
props dans un objet que nous utilisons comme ceci
JSON.parse(JSON.stringify(obj));
Sortie:{a: 1, c: 3}
Je préfère utiliser quelque chose comme Lodash:
import { pickBy, identity } from 'lodash'
const cleanedObject = pickBy(originalObject, identity)
Notez que la fonction d'identité est juste x => x
et son résultat sera faux pour toutes les valeurs fausses. Donc, cela supprime les caractères indéfinis, "", 0, null, ...
Si vous souhaitez uniquement que les valeurs undefined
soient supprimées, procédez comme suit:
const cleanedObject = pickBy(originalObject, v => v !== undefined)
Cela vous donne un nouvel objet, ce qui est généralement préférable à la mutation de l'objet d'origine, comme le suggèrent certaines des autres réponses.
Cette solution évite également hasOwnProperty()
comme Object.keys renvoie un tableau des propriétés énumérables propres à un objet donné.
Object.keys(obj).forEach(function (key) {
if(typeof obj[key] === 'undefined'){
delete obj[key];
}
});
et vous pouvez ajouter ceci comme null
ou ''
pour un nettoyage plus strict.
Parce que cela ne semble pas avoir été mentionné, voici ma méthode préférée, sans effets secondaires ou dépendances externes:
const obj = {
a: 1,
b: undefined
}
const newObject = Object.keys(obj).reduce((acc, key) => {
const _acc = acc;
if (obj[key] !== undefined) _acc[key] = obj[key];
return _acc;
}, {})
console.log(newObject)
// Object {a: 1}
Celui-ci est facile à retenir, mais peut être lent. Utilisez jQuery pour copier des propriétés non NULL dans un objet vide. Aucune copie complète à moins d’ajouter true
comme premier argument.
myObj = $.extend({}, myObj);
Voici une solution javascript simple (sans bibliothèque requise):
function removeUndefinedProps(obj) {
for (var prop in obj) {
if (obj.hasOwnProperty(prop) && obj[prop] === undefined) {
delete obj[prop];
}
}
}
Démo de travail: http://jsfiddle.net/jfriend00/djj5g5fu/
Mhh .. Je pense que @Damian demande remove undefined field (property) from an JS object
. Ensuite, je ferais simplement:
for (const i in myObj)
if (typeof myObj[i] === 'undefined')
delete myObj[i];
Solution courte et efficace, dans (Vanilla) JS! Exemple :
const myObj = {
a: 1,
b: undefined,
c: null,
d: 'hello world'
};
for (const i in myObj)
if (typeof myObj[i] === 'undefined')
delete myObj[i];
console.log(myObj);
Une autre solution Javascript
for(var i=0,keys = Object.keys(obj),len=keys.length;i<len;i++){
if(typeof obj[keys[i]] === 'undefined'){
delete obj[keys[i]];
}
}
Aucune vérification additionnelle de hasOwnProperty
n'est requise car Object.keys
ne cherche pas la chaîne de prototypes et ne renvoie que les propriétés de obj
.