¿Cómo elimino todos los atributos que están undefined
o null
en un objeto JavaScript?
(La pregunta es similar a esta para las matrices)
javascript
abhijit
fuente
fuente
Respuestas:
Puede recorrer el objeto:
Si le preocupa que esta eliminación de propiedad no ejecute la cadena de tipo de objeto, también puede:
Algunas notas sobre nulo vs indefinido:
fuente
Usando algunos ES6 / ES2015 :
1) Una línea simple para eliminar los elementos en línea sin asignación:
jsbin
2) Este ejemplo fue eliminado ...
3) Primer ejemplo escrito como una función:
jsbin
4) Esta función también utiliza la recursión para eliminar elementos de objetos anidados:
jsbin
4b) Esto es similar a 4), pero en lugar de mutar el objeto fuente directamente, devuelve un nuevo objeto.
5) Un enfoque funcional para 4b) basado en la respuesta de @ MichaelJ.Zoidl usando
filter()
yreduce()
. Este también devuelve un nuevo objeto:jsbin
6) Igual que 4) pero con ES7 / 2016
Object.entries()
.5b) Otra versión funcional que utiliza la recursión y devuelve un nuevo objeto con ES2019
Object.fromEntries()
:7) Igual que 4) pero en ES5 simple :
jsbin
fuente
keys
de unaobject
, por lo queo
yk
son evidentes. Pero supongo que es cuestión de gustos.Object.keys(myObj).forEach(function (key) {(myObj[key] == null) && delete myObj[key]});
Object.entries(myObj).reduce((acc, [key, val]) => { if (val) acc[key] = val; return acc; }, {})
Si está usando lodash o underscore.js, aquí hay una solución simple:
Esto solo funcionará con lodash 4, pre lodash 4 o underscore.js, use
_.pick(obj, _.identity)
;fuente
_.omit(obj, _.isUndefined)
es mejor._.isUndefined
no omite nulos, se usa_.omitBy(obj, _.isNil)
para omitir ambosundefined
ynull
Los revestimientos más cortos para ES6 +
Filtrar todos los valores Falsy (
""
,0
,false
,null
,undefined
)Filtro
null
yundefined
valores:Filtro SOLO
null
Filtro SOLO
undefined
Soluciones recursivas: filtros
null
yundefined
Para objetos:
Para objetos y matrices:
fuente
v == null
usas verificará contraundefined
ynull
.cleanEmpty
soluciones recursivas devolverán un objeto vacío{}
para objetos DateSi alguien necesita una versión recursiva de la respuesta de Owen (y Eric), aquí está:
fuente
hasOwnProperty
usandoif(test.hasOwnProperty(i)) { ... }
JSON.stringify elimina las claves indefinidas.
fuente
null
ser tratado comoundefined
usar la función de reemplazo, para obtener más información, consulte esta respuesta: stackoverflow.com/questions/286141/…null
valores. Prueba:let a = { b: 1, c: 0, d: false, e: null, f: undefined, g: [], h: {} }
y luegoconsole.log(removeUndefined(a))
. La pregunta era sobreundefined
ynull
valores.Probablemente esté buscando la
delete
palabra clave.fuente
La solución Lodash más simple posible para devolver un objeto con los valores
null
yundefined
filtrados._.omitBy(obj, _.isNil)
fuente
Puede usar una combinación de
JSON.stringify
, su parámetro de reemplazo yJSON.parse
convertirlo nuevamente en un objeto. El uso de este método también significa que el reemplazo se realiza a todas las claves anidadas dentro de los objetos anidados.Objeto de ejemplo
Función de reemplazo
Limpiar el objeto
Ejemplo de CodePen
fuente
Usando ramda # pickBy eliminará todo
null
,undefined
y losfalse
valores:Como señaló @manroe, para mantener los
false
valores useisNil()
:fuente
(v) => !R.isNil(v)
es probablemente una mejor opción para la pregunta de OP, dado quefalse
u otros valores falsos también serían rechazados porR.identity
Enfoque funcional e inmutable, sin
.filter
y sin crear más objetos de los necesariosfuente
obj[key] === undefined
aobj[key] === undefined || obj[key] === null
const omitFalsy = obj => Object.keys(obj).reduce((acc, key) => ({ ...acc, ...(obj[key] && { [key]: obj[key] }) }), {});
Puede hacer una eliminación recursiva en una línea usando el argumento de reemplazo de json.stringify
Uso:
Como se menciona en el comentario de Emmanuel, esta técnica solo funciona si su estructura de datos contiene solo tipos de datos que se pueden poner en formato JSON (cadenas, números, listas, etc.).
(Esta respuesta ha sido actualizado para utilizar el nuevo operador Nullish coalescente en función de las necesidades de apoyo del navegador es posible que desee utilizar esta función en lugar:.
(k,v) => v!=null ? v : undefined
)fuente
NaN
a lasnull
que no se eliminan.puedes hacerlo más corto con
!
condiciónRecuerde en uso: como @semicolor anuncia en los comentarios: Esto también eliminaría propiedades si el valor es una cadena vacía, falsa o cero
fuente
[null, undefined].includes(r[k])
lugar de!r[k]
.Solución pura ES6 más corta, conviértala en una matriz, use la función de filtro y vuelva a convertirla en un objeto También sería fácil hacer una función ...
Por cierto. con esto
.length > 0
verifico si hay una cadena / matriz vacía, por lo que eliminará las claves vacías.JS BIN https://jsbin.com/kugoyinora/edit?js,console
fuente
null
yundefined
sería más fácil de usarMY_OBJECT[f] != null
. Su solución actual elimina todo menos las cadenas / listas no vacías y arroja un error cuando los valores sonnull
filter
, sería más legible.omit
, debes verificar que obj existe antes de llamarObject.keys
:const omit = (obj, filter) => obj && Object.keys(obj).filter(key => !filter(obj[key])).reduce((acc,key) => {acc[key] = obj[key]; return acc}, {});
Si desea 4 líneas de una solución ES7 pura:
O si prefieres una versión más legible:
Esto preservará los valores booleanos y también limpiará las matrices. También conserva el objeto original al devolver una copia limpia.
fuente
Tengo el mismo escenario en mi proyecto y lo logré usando el siguiente método.
Funciona con todos los tipos de datos, algunos mencionados anteriormente no funcionan con fecha y matrices vacías.
removeEmptyKeysFromObject.js
pasar cualquier objeto a esta función removeEmptyKeysFromObject ()
fuente
Para una búsqueda profunda utilicé el siguiente código, tal vez sea útil para cualquiera que esté mirando esta pregunta (no es utilizable para dependencias cíclicas):
fuente
Si no desea mutar en su lugar, pero devuelve un clon con el valor nulo / indefinido eliminado, puede usar la función de reducción ES6.
fuente
En lugar de eliminar la propiedad, también puede crear un nuevo objeto con las claves que no son nulas.
fuente
Para aprovechar la respuesta de Ben sobre cómo resolver este problema usando lodash
_.pickBy
, también puede resolver este problema en la biblioteca hermana: Underscore.js 's_.pick
.Ver: Ejemplo de JSFiddle
fuente
un asistente de reducción puede hacer el truco (sin verificación de tipo) -
fuente
Si alguien necesita eliminar
undefined
valores de un objeto con una búsqueda profunda,lodash
entonces aquí está el código que estoy usando. Es bastante simple modificarlo para eliminar todos los valores vacíos (null
/undefined
).fuente
Con Lodash:
fuente
Si usa eslint y desea evitar la desconexión de la regla de no reasignar parámetros, puede usar Object.assign junto con .reduce y un nombre de propiedad calculado para una solución ES6 bastante elegante:
fuente
Aquí hay una forma funcional de eliminar
nulls
de un Objeto usando ES6 sin mutar el objeto usando soloreduce
:fuente
stripNulls
función utiliza una referencia desde fuera del alcance de la función del acumulador; y también mezcla las preocupaciones al filtrar dentro de la función del acumulador. Eg (pObject.entries(o).filter(([k,v]) => v !== null).reduce((o, [k, v]) => {o[k] = v; return o;}, {});
. Ej. ) Sí, recorrerá los elementos filtrados dos veces, pero la pérdida de rendimiento realizada allí es insignificante.También puede usar la
...
sintaxis de propagación usandoforEach
algo como esto:fuente
Objeto limpio en su lugar
Función pura
fuente
Podemos usar JSON.stringify y JSON.parse para eliminar atributos en blanco de un objeto.
fuente
{} != {}
y[] != []
), pero por lo demás el enfoque es válidoAquí hay una función recursiva integral (originalmente basada en la de @chickens) que:
defaults=[undefined, null, '', NaN]
USO:
fuente
Si prefiere el enfoque puro / funcional
fuente