web-dev-qa-db-fra.com

Javascript - supprimer des champs non définis d'un objet

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]) }))
50
Damian

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])

jsbin

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;
};

jsbin

88
Rotareti

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}

44
nmanikiran

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.

34
Thijs Koerselman

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.

12
Alvaro Pinot

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}
11
ptim

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);
3
Fredrik

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/

2
jfriend00

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);
1
Dam Fa

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.

DÉMO

0
Prabhu Murthy