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
});
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;
}
});
_.compact
. Eliminará propiedades, en lugar de crear un clon superficial solo con valores veraces. Ver stackoverflow.com/a/19750822/465684 a continuación
delete
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
:
_.pick(sourceObj, _.identity)
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.
pick _.pick (objeto, * claves)
Devuelve una copia del objeto , filtrado para tener solo valores para las claves en la lista blanca (o una matriz de claves válidas). También acepta un predicado que indica qué claves elegir.
_.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.
_.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 se arr.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
_.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;});
_.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.
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;
});
var compactObject = _.partialRight(_.pick, _.identity);
_.pickBy(object)
es todo lo que necesita
Object.keys(o).forEach(function(k) {
if (!o[k]) {
delete o[k];
}
});
.keys
y .forEach
.
forEach
método de JS
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'
// }
// }
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.
en el lodash te gusta esto:
_.pickBy(object, _.identity);
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.