Tengo un objeto con varias propiedades. Me gustaría eliminar cualquier propiedad que tenga valores falsos.
Esto se puede lograr con compact
matrices, pero ¿qué pasa con los objetos?
Tengo un objeto con varias propiedades. Me gustaría eliminar cualquier propiedad que tenga valores falsos.
Esto se puede lograr con compact
matrices, pero ¿qué pasa con los objetos?
Respuestas:
Puede crear su propio complemento de subrayado (mixin):
_.mixin({ compactObject: function(o) { _.each(o, function(v, k) { if(!v) { delete o[k]; } }); return o; } });
Y luego úselo como un método de subrayado nativo:
var o = _.compactObject({ foo: 'bar', a: 0, b: false, c: '', d: null, e: undefined });
Actualizar
Como señaló @AndreiNeculau , este mixin afecta al objeto original, mientras que el método de subrayado original devuelve una copia de la matriz . Para resolver este problema y hacer que nos comportemos más como su primo , aquí hay una actualización menor:
compact
compactObject
_.mixin({ compactObject : function(o) { var clone = _.clone(o); _.each(clone, function(v, k) { if(!v) { delete clone[k]; } }); return clone; } });
fuente
_.compact
. Eliminará propiedades, en lugar de crear un clon superficial solo con valores veraces. Ver stackoverflow.com/a/19750822/465684 a continuacióndelete
generalmente se desaconseja el uso, ya que expone inmediatamente las propiedades con el mismo nombre de la cadena del prototipo y también perjudica el rendimiento debido a las "clases ocultas" (V8): cambiar la estructura del objeto hace que el motor haga un trabajo adicional. La mejor y más corta solución sería_.pick(o, _.identity)
.Desde la versión 1.7.0 de Underscore, puede usar
_.pick
:Explicación
El segundo parámetro
_.pick
puede ser una función de predicado para seleccionar valores. Se seleccionan los valores para los que el predicado devuelve veracidad y los valores para los que el predicado devuelve falsedad se ignoran._.identity
es una función auxiliar que devuelve su primer argumento, lo que significa que también funciona como una función de predicado que selecciona valores verdaderos y rechaza los falsos. La biblioteca Underscore también viene con un montón de otros predicados, por ejemplo_.pick(sourceObj, _.isBoolean)
, solo retendría propiedades booleanas.Si usa mucho esta técnica, es posible que desee hacerla un poco más expresiva:
var pickNonfalsy = _.partial(_.pick, _, _.identity); // Place this in a library module or something pickNonfalsy(sourceObj);
_.pick
También se proporcionó la versión 1.6.0 de subrayado , pero no aceptó una función de predicado en lugar de una lista blanca.fuente
_.identity
función, muy útil._.omit(sourceObj, _.isUndefined)
para eliminar solo valores no definidos (permitiendo falso, nulo, 0).pick(obj, Boolean)
para eliminar los valores de falsey, ese mismo enfoque se puede usar cuando searr.filter(Boolean)
limpia una matriz de valores de falsey ..._.pick(sourceObj, prop => prop)
_.pick
funciona con nombres de propiedad, para esta funcionalidad como se menciona en el uso posterior_.pickBy
Rápido y claro:
_.omitBy( source, i => !i );
Esto se expresa de manera inversa a la respuesta de Emil. De esta manera, en mi humilde opinión, lee más claro; se explica más por sí mismo.
Un poco menos limpio si no tiene el lujo de ES6:
_.omitBy( source, function(i){return !i;});
Alterno:
_.omitBy( source, _.isEmpty)
El uso
_.isEmpty
, en lugar de la_.identity
veracidad, también eliminará convenientemente matrices y objetos vacíos de la colección y quizás eliminará números y fechas de manera inconveniente . Por lo tanto, el resultado NO es una respuesta exacta a la pregunta del OP, sin embargo, podría ser útil cuando se busca eliminar colecciones vacías.fuente
omitBy
. lodash.com/docs#omitBy_.pick(source, i => i);
que evita la negación_.pickBy(source)
es todo lo que se necesita._.isEmpty(5) === true
. Por tanto, los valores que son números se eliminarán.Con la transformación de Lodash ,
_.transform(obj, function(res, v, k) { if (v) res[k] = v; });
fuente
var compactObject = _.partialRight(_.pick, _.identity);
_.pickBy
lugar de_.pick
)_.pickBy(object)
es todo lo que necesitaObject.keys(o).forEach(function(k) { if (!o[k]) { delete o[k]; } });
fuente
.keys
y.forEach
.forEach
método de JSPuede crear un clon superficial:
_(obj).reduce(function(a,v,k){ if(v){ a[k]=v; } return a; },{});
fuente
para eliminar el uso de objetos.
for(var k in obj){ if(obj.hasOwnProperty(k) && !obj[k]){ delete obj[k]; } }
fuente
De repente, necesitaba crear una función para eliminar las falsificaciones de forma recursiva. Espero que esto ayude. Estoy usando 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 });
Entonces puedes usarlo:
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' // } // }
fuente
Para agregar a la respuesta de gion_13:
_.mixin({ compactObject : function(o) { var newObject = {}; _.each(o, function(v, k) { if(v !== null && v !== undefined) { newObject[k] = v } }); return newObject; } });
Éste crea un nuevo objeto y agrega claves y valores en lugar de clonar todo y eliminar pares clave-valor. Diferencia menor.
Pero lo que es más importante, comprueba explícitamente si hay nulos e indefinidos en lugar de falsey, lo que eliminará los pares clave-valor que tengan falso como valor.
fuente
en el lodash te gusta esto:
fuente
Aunque
_.compact
está documentado para su uso en matrices. También parece funcionar para objetos. Acabo de ejecutar lo siguiente en las consolas Chrome, Opera y Firefox:var obj = {first: 1, second: null, third: 3, fourth: function(){return 5}} undefined _.compact(obj) [1, 3, function()]
ACTUALIZACIÓN: como indica el ejemplo, la llamada
_.compact
a un objeto soltará las claves y devolverá una matriz compactada.fuente