J'ai un objet avec plusieurs propriétés. Je voudrais supprimer toutes les propriétés qui ont des valeurs de fausseté.
Ceci peut être réalisé avec compact
sur les tableaux, mais qu'en est-il des objets?
Vous pouvez créer votre propre plugin de soulignement (mixin):
_.mixin({
compactObject: function(o) {
_.each(o, function(v, k) {
if(!v) {
delete o[k];
}
});
return o;
}
});
Et utilisez-le ensuite comme méthode de soulignement native:
var o = _.compactObject({
foo: 'bar',
a: 0,
b: false,
c: '',
d: null,
e: undefined
});
Comme @AndreiNeculau _ { souligné , ce mixin affecte l'objet d'origine, tandis que la méthode compact
underscore originale retourne une copie du tableau .
Pour résoudre ce problème et faire en sorte que notre compactObject
se comporte davantage comme s'il s'agissait de cousin, voici une mise à jour mineure:
_.mixin({
compactObject : function(o) {
var clone = _.clone(o);
_.each(clone, function(v, k) {
if(!v) {
delete clone[k];
}
});
return clone;
}
});
Depuis Underscore version 1.7.0, vous pouvez utiliser _.pick
:
_.pick(sourceObj, _.identity)
Le second paramètre à _.pick
peut être une fonction de prédicat pour la sélection de valeurs. Les valeurs pour lesquelles le prédicat renvoie vérité sont sélectionnées et les valeurs pour lesquelles le prédicat renvoie falsy sont ignorées.
pick _.pick (objet, touches *)
Retourne une copie de object, filtrée pour n'avoir que des valeurs pour les keys de la liste blanche (ou un tableau de clés valides). Vous pouvez également accepter un prédicat indiquant les clés à sélectionner.
_.identity
est une fonction d'assistance qui renvoie son premier argument, ce qui signifie qu'elle fonctionne également comme une fonction de prédicat qui sélectionne les valeurs de vérité et rejette les valeurs fausses. La bibliothèque Underscore est également fournie avec d'autres prédicats, par exemple, _.pick(sourceObj, _.isBoolean)
ne conserve que les propriétés booléennes.
Si vous utilisez beaucoup cette technique, vous voudrez peut-être la rendre un peu plus expressive:
var pickNonfalsy = _.partial(_.pick, _, _.identity); // Place this in a library module or something
pickNonfalsy(sourceObj);
Underscore la version 1.6.0 fournissait également _.pick
, mais elle n’acceptait pas de fonction de prédicat au lieu d’une liste blanche.
_.omit( source, i => !i );
Ceci est indiqué de manière inverse à la réponse d'Emil. De cette façon, mon humble avis est plus clair; c'est plus explicite.
Un peu moins propre si vous n'avez pas le luxe d'ES6: _.omit( source, function(i){return !i;});
_.omit( source, _.isEmpty)
L'utilisation de_.isEmpty
, au lieu de _.identity
pour plus de vérité, supprimera également les tableaux et objets vides de la collection et supprimera peut-être les nombres et les dates . Ainsi, le résultat N'EST PAS une réponse exacte à la question du PO, mais cela pourrait être utile pour supprimer des collections vides.
Avec lodash's transform ,
_.transform(obj, function(res, v, k) {
if (v) res[k] = v;
});
Object.keys(o).forEach(function(k) {
if (!o[k]) {
delete o[k];
}
});
Vous pouvez créer un clone peu profond:
_(obj).reduce(function(a,v,k){
if(v){ a[k]=v; }
return a;
},{});
pour utiliser un objet delete.
for(var k in obj){
if(obj.hasOwnProperty(k) && !obj[k]){
delete obj[k];
}
}
Du coup, il me fallut créer une fonction pour supprimer récursivement les faux J'espère que ça aide. J'utilise Lodash.
var removeFalsies = function (obj) {
return _.transform(obj, function (o, v, k) {
if (v && typeof v === 'object') {
o[k] = _.removeFalsies(v);
} else if (v) {
o[k] = v;
}
});
};
_.mixin({ 'removeFalsies': removeFalsies });
Ensuite, vous pouvez l'utiliser:
var o = _.removeFalsies({
foo: 'bar',
a: 0,
b: false,
c: '',
d: null,
e: undefined,
obj: {
foo: 'bar',
a: 0,
b: false,
c: '',
d: null,
e: undefined
}
});
// {
// foo: 'bar',
// obj: {
// foo: 'bar'
// }
// }
Pour ajouter à la réponse de gion_13:
_.mixin({
compactObject : function(o) {
var newObject = {};
_.each(o, function(v, k) {
if(v !== null && v !== undefined) {
newObject[k] = v
}
});
return newObject;
}
});
Celui-ci crée un nouvel objet et ajoute des clés et des valeurs au lieu de tout cloner et de supprimer des paires clé-valeur. Différence mineure.
Mais plus important encore, vérifie explicitement les valeurs null et undefined au lieu de falsey, ce qui supprimera les paires clé-valeur dont la valeur est false.
dans le lodash vous faites comme ceci:
_.pickBy(object, _.identity);