¿Cómo elimino todos los atributos que están undefinedo nullen 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
keysde unaobject, por lo queoykson 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._.isUndefinedno omite nulos, se usa_.omitBy(obj, _.isNil)para omitir ambosundefinedynullLos revestimientos más cortos para ES6 +
Filtrar todos los valores Falsy (
"",0,false,null,undefined)Filtro
nullyundefinedvalores:Filtro SOLO
nullFiltro SOLO
undefinedSoluciones recursivas: filtros
nullyundefinedPara objetos:
Para objetos y matrices:
fuente
v == nullusas verificará contraundefinedynull.cleanEmptysoluciones 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
hasOwnPropertyusandoif(test.hasOwnProperty(i)) { ... }JSON.stringify elimina las claves indefinidas.
fuente
nullser tratado comoundefinedusar la función de reemplazo, para obtener más información, consulte esta respuesta: stackoverflow.com/questions/286141/…nullvalores. Prueba:let a = { b: 1, c: 0, d: false, e: null, f: undefined, g: [], h: {} }y luegoconsole.log(removeUndefined(a)). La pregunta era sobreundefinedynullvalores.Probablemente esté buscando la
deletepalabra clave.fuente
La solución Lodash más simple posible para devolver un objeto con los valores
nullyundefinedfiltrados._.omitBy(obj, _.isNil)fuente
Puede usar una combinación de
JSON.stringify, su parámetro de reemplazo yJSON.parseconvertirlo 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,undefinedy losfalsevalores:Como señaló @manroe, para mantener los
falsevalores useisNil():fuente
(v) => !R.isNil(v)es probablemente una mejor opción para la pregunta de OP, dado quefalseu otros valores falsos también serían rechazados porR.identityEnfoque funcional e inmutable, sin
.filtery sin crear más objetos de los necesariosfuente
obj[key] === undefinedaobj[key] === undefined || obj[key] === nullconst 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
NaNa lasnullque 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 > 0verifico 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
nullyundefinedserí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 sonnullfilter, 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
undefinedvalores de un objeto con una búsqueda profunda,lodashentonces 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
nullsde un Objeto usando ES6 sin mutar el objeto usando soloreduce:fuente
stripNullsfunció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 usandoforEachalgo 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