Je dois supprimer les propriétés d'objet 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)
je reçois aussi la propriété de l'âge. Je suis conscient que je peux utiliser
delete credentials.age
mais que se passe-t-il si j'ai plus de 10 objets indésirables. Puis-je y parvenir avec lodash.
Obtenez une liste des propriétés de model
en utilisant _.keys()
, et utilisez _.pick()
pour extraire les propriétés de credentials
dans 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);
Vous pouvez l’approcher depuis une liste blanche ou noire:
// Black list
// Remove the values you don't want
var result = _.omit(credentials, ['age']);
// White list
// Only allow certain values
var result = _.pick(credentials, ['fname', 'lname']);
S'il s'agit d'une logique métier réutilisable, vous pouvez également la partager:
// Partial out a black list version
var clean = _.partial(_.omit, _, ['age']);
// and later
var result = clean(credentials);
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)
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 simplement utiliser du JavaScript pur (spécialement si vous utilisez ES6), 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);
Ici, j'ai utilisé omit 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)
Pour sélectionner (ou supprimer) les propriétés d'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;
}
});
}