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 ?

211voto

Chris Points 3371

Vous pouvez l'aborder en adoptant une approche de type "liste autorisée" ou "liste bloquée" :

// Block list
// Remove the values you don't want
var result = _.omit(credentials, ['age']);

// Allow list
// Only allow certain values
var result = _.pick(credentials, ['fname', 'lname']);

S'il s'agit d'une logique d'entreprise réutilisable, vous pouvez également l'extraire partiellement :

// Partial out a "block list" version
var clean = _.partial(_.omit, _, ['age']);

// and later
var result = clean(credentials);

Notez que Lodash 5 ne prendra plus en charge la fonction omit.

Une approche similaire peut être réalisée sans Lodash :

const transform = (obj, predicate) => {
    return Object.keys(obj).reduce((memo, key) => {
    if(predicate(obj[key], key)) {
        memo[key] = obj[key]
    }
    return memo
    }, {})
}

const omit = (obj, items) => transform(obj, (value, key) => !items.includes(key))

const pick = (obj, items) => transform(obj, (value, key) => items.includes(key))

// Partials
// Lazy clean
const cleanL = (obj) => omit(obj, ['age'])

// Guarded clean
const cleanG = (obj) => pick(obj, ['fname', 'lname'])

// "App"
const credentials = {
    fname:"xyz",
    lname:"abc",
    age:23
}

const omitted = omit(credentials, ['age'])
const picked = pick(credentials, ['age'])
const cleanedL = cleanL(credentials)
const cleanedG = cleanG(credentials)

4 votes

C'est la bonne réponse puisque la fonction qui supprime est _.omit tandis que _.pick précise ce que vous voulez (ce qui est tout à fait le contraire)

0 votes

Correct - et dépend de votre approche générale et de la logique commerciale environnante - l'une ou l'autre version fonctionnera en fonction de vos exigences.

0 votes

Pour le partiel, vous avez fait une faute de frappe, son _.partial(_.omit ... .

76voto

Ori Drori Points 65611

Obtenez une liste de propriétés de model en utilisant _.keys() et utiliser _.pick() pour extraire les propriétés de credentials à un nouvel objet :

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

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

var result = _.pick(credentials, _.keys(model));

console.log(result);

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>

Si vous ne voulez pas utiliser Lodash, vous pouvez utiliser Object.keys() et Array.prototype.reduce() :

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

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

var result = Object.keys(model).reduce(function(obj, key) {
  obj[key] = credentials[key];
  return obj;
}, {});

console.log(result);

8voto

Mauro Junior Points 41

Vous pouvez facilement le faire en utilisant _.pick :

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

var credentials = {
  fname: 'abc',
  lname: 'xyz',
  age: 2
};

var result = _.pick(credentials, _.keys(model));

console.log('result =', result);

<script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>

Mais vous pouvez tout simplement utiliser du JavaScript pur (surtout si vous utilisez la fonction ECMAScript 6 ), comme ceci :

const model = {
  fname: null,
  lname: null
};

const credentials = {
  fname: 'abc',
  lname: 'xyz',
  age: 2
};

const newModel = {};

Object.keys(model).forEach(key => newModel[key] = credentials[key]);

console.log('newModel =', newModel);

6voto

yungy Points 41

Lodash unset convient pour supprimer quelques touches indésirables.

const myObj = {
    keyOne: "hello",
    keyTwo: "world"
}

unset(myObj, "keyTwo");

console.log(myObj); /// myObj = { keyOne: "hello" }

4voto

Anupam Maurya Points 126

Ici, j'ai utilisé omettre() pour la "clé" respective que vous voulez supprimer... en utilisant la bibliothèque Lodash :

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

let result = _.map(credentials, object => {
                       return _.omit(object, ['fname', 'lname'])
                   })

console.log('result', result)

3 votes

Faites attention lorsque vous voulez utiliser omit J'aimais bien omit avant mais maintenant il a removed : github.com/lodash/lodash/issues/2930

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