Tengo un objeto Javascript como:
var my_object = { a:undefined, b:2, c:4, d:undefined };
¿Cómo eliminar todas las propiedades indefinidas? Los atributos falsos deberían permanecer.
javascript
object
lodash
JLavoie
fuente
fuente
_.pickBy(obj, _.identity);
false
ValuSimplemente puede encadenar
_.omit()
con_.isUndefined
y_.isNull
composiciones, y obtener el resultado con una evaluación perezosa.Manifestación
Actualización 14 de marzo de 2016 :
Como lo mencionan los dylants en la sección de comentarios, debe usar la
_.omitBy()
función ya que usa un predicado en lugar de una propiedad. Debe usar esto para la versión lodash4.0.0
y superior.MANIFESTACIÓN
Actualización 1 de junio de 2016 :
Como comentó Max Truxa , lodash ya proporcionó una alternativa
_.isNil
, que verifica ambosnull
yundefined
:fuente
omitBy
función en lugar deomit
. So_(my_object).omitBy(_.isUndefined).omitBy(_.isNull).value();
_.isNil
lugar de encadenar_.isUndefined
y_.isNull
. Esto lo hace aún más corto:var result = _.omitBy(my_object, _.isNil);
omitBy
tiene menos rendimiento quepickBy
, por lo que se debe preferir este último, y la condición en la función iterada se invierte. La respuesta aceptada arriba acertó.null
yundefined
valores. Elidentity
predicado también eliminaráfalse
valores, por lo que si simplemente lo basó en la intención de la pregunta, entonces no veo un problema con mi respuesta. Además, si estamos hablando de "rendimiento",omitBy
simplemente llamapickBy
con unidentity
predicado negado , por defecto. Entonces, en términos de rendimiento, es demasiado pequeño para ser significativo.si está usando lodash, puede usar
_.compact(array)
para eliminar todos los valores falsos de una matriz.https://lodash.com/docs/4.17.4#compact
fuente
_.pickBy(object, _.isNumber)
en ese caso.La respuesta correcta es:
Eso da como resultado:
La alternativa dada aquí por otras personas:
Eliminará también los
false
valores que no se desean aquí.fuente
{"a":1,"b":{"a":1,"b":null,"c":undefined}}
, propiedad object.bb
, 'c' no se eliminaráSólo:
Lo anterior no tiene en cuenta los
null
valores, ya que faltan en el ejemplo original y se mencionan solo en el tema, pero lo dejo ya que es elegante y podría tener sus usos.Aquí está el ejemplo completo, menos conciso, pero más completo.
fuente
_.omitBy
.Para completar las otras respuestas, en lodash 4 para ignorar solo indefinido y nulo (y no propiedades como
false
) puede usar un predicado en_.pickBy
:_.pickBy(obj, v !== null && v !== undefined)
Ejemplo a continuación:
fuente
0
,''
,false
valores. También puede acortar la devolución de llamada av => v != null
.De acuerdo con lodash docs:
También puedes filtrar todos los nulos
fuente
Para objetos anidados profundos, puede usar mi fragmento para lodash> 4
fuente
Encontré un problema similar con la eliminación
undefined
de un objeto (profundamente), y descubrí que si está bien para convertir su objeto antiguo simple y usar JSON, una función auxiliar rápida y sucia se vería así:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Description
"... Si no se define, se encuentra una función o un símbolo durante la conversión, se omite (cuando se encuentra en un objeto) o se censura a nulo (cuando se encuentra en una matriz)".
fuente
con JavaScript puro: (aunque Object.entries es ES7, Object.assign es ES6; pero el ES5 equivalente usa Object.keys solo debería ser factible); también observe las
v != null
comprobaciones tanto para nulo como para indefinido;Editar: esta a continuación es la versión con ES5 Object.keys solamente: pero en general con ES7 en el Nodo v8 es bastante agradable ;-)
Actualización en octubre de 2017 : con el Nodo v8 (desde v8.3 más o menos) ahora tiene una construcción de difusión de objetos:
o dentro de una reducción solamente:
Actualización: alguien quiere recursivo? tampoco es tan difícil, solo necesito una verificación adicional de isObject y recursivamente se llama a sí mismo:
Mi conclusión: si JavaScript puro puede hacer, evitaría las dependencias de la biblioteca de terceros:
fuente
Dado que algunos de ustedes podrían haber llegado a la pregunta buscando eliminar específicamente solo
undefined
, pueden usar:una combinación de métodos de Lodash
el
rundef
paquete, que elimina solo lasundefined
propiedadesSi necesita eliminar propiedades de forma recursiva
undefined
, elrundef
paquete también tiene unarecursive
opción.Consulte la documentación para más detalles.
fuente
Aquí está el enfoque lodash que tomaría:
La función pares () convierte el objeto de entrada en una matriz de matrices de clave / valor. Haces esto para que sea más fácil usar rechazar () para eliminar
undefined
ynull
valores. Después, te quedan pares que no fueron rechazados, y estos son datos de entrada para zipObject () , que reconstruye tu objeto por ti.fuente
Teniendo en cuenta que
undefined == null
podemos escribir de la siguiente manera:JSBin ejemplo
fuente
pickBy usa identidad por defecto:
fuente
El camino más corto (lodash v4):
fuente
Con lodash (o guión bajo) puede hacer
De lo contrario, con JavaScript vainilla, puedes hacer
No usar una prueba de falsey, porque no solo se rechazará "indefinido" o "nulo" , sino que también hay otro valor de falsey como "falso", "0", cadena vacía, {}. Por lo tanto, solo para hacerlo simple y comprensible, opté por usar una comparación explícita como se codificó anteriormente.
fuente
Para omitir todos los valores de falsey pero mantener las primitivas booleanas, esta solución ayuda.
fuente
fuente
Usaría guión bajo y me ocuparía de las cadenas vacías también:
jsbin .
fuente
Para objetos anidados profundos y matrices. y excluir valores vacíos de cadena y NaN
resultado:
fuente
Me gusta usar _.pickBy, porque tienes control total sobre lo que estás eliminando:
Fuente: https://www.codegrepper.com/?search_term=lodash+remove+undefined+values+from+object
fuente
Para aquellos de ustedes que están aquí buscando eliminar de una matriz de objetos y usar lodash, pueden hacer algo como esto:
Nota: No tienes que destruir si no quieres.
fuente