102 votes

Suppression des propriétés des objets avec Lodash

Je dois supprimer des propriétés d'objets indésirables qui ne correspondent pas à mon modèle. Comment puis-je y parvenir avec Lodash ?

Mon modèle est :

var model = {
   fname: null,
   lname: null
}

La sortie de mon contrôleur avant l'envoi au serveur sera :

var credentials = {
    fname: "xyz",
    lname: "abc",
    age: 23
}

Si j'utilise

 _.extend(model, credentials)

J'obtiens également la propriété de l'âge. Je sais que je peux utiliser

delete credentials.age

mais que faire si j'ai plus de 10 objets indésirables ? Puis-je le faire avec Lodash ?

1voto

Vous pouvez utiliser _.omit() pour émettre la clé à partir d'un tableau JSON si vous avez moins d'objets :

_.forEach(data, (d) => {
    _.omit(d, ['keyToEmit1', 'keyToEmit2'])
});

Si vous avez plus d'objets, vous pouvez utiliser l'inverse, soit _.pick() :

_.forEach(data, (d) => {
    _.pick(d, ['keyToPick1', 'keyToPick2'])
});

0voto

Ando Points 407

Pour sélectionner (ou supprimer) les propriétés d'un objet qui satisfont à une condition donnée. profondément vous pouvez utiliser quelque chose comme ceci :

function pickByDeep(object, condition, arraysToo=false) {
  return _.transform(object, (acc, val, key) => {
    if (_.isPlainObject(val) || arraysToo && _.isArray(val)) {
      acc[key] = pickByDeep(val, condition, arraysToo);
    } else if (condition(val, key, object)) {
      acc[key] = val;
    }
  });
}

https://codepen.io/aercolino/pen/MWgjyjm

0voto

iliya.rudberg Points 327

Voici ma solution pour supprimer en profondeur les propriétés vides avec Lodash :

const compactDeep = obj => {
    const emptyFields = [];

    function calculateEmpty(prefix, source) {
        _.each(source, (val, key) => {
           if (_.isObject(val) && !_.isEmpty(val)) {
                calculateEmpty(`${prefix}${key}.`, val);
            } else if ((!_.isBoolean(val) && !_.isNumber(val) && !val) || (_.isObject(val) && _.isEmpty(val))) {
                emptyFields.push(`${prefix}${key}`);
            }
        });
    }

    calculateEmpty('', obj);

    return _.omit(obj, emptyFields);
};

1 votes

Quelle est l'idée ? Que fait votre solution ?

0 votes

-1 ; ce n'est pas utile pour résoudre l'exemple de problème donné par le demandeur, ni pour le problème générique de la suppression des propriétés d'un objet ; c'est une solution à un problème bizarrement arbitraire qui n'est pas celui posé et qui n'est pas explicité dans cette réponse. Il n'est pas non plus idempotent ( compactDeep({a: {b: []}}) donne un résultat différent de compactDeep(compactDeep({a: {b: []}})) ce qui ressemble à un bogue, bien que l'on ne puisse pas vraiment l'affirmer objectivement puisque l'on ne précise pas ce que cela est censé faire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X