Como removo todos os atributos que estão undefined
ou estão null
em um objeto JavaScript?
(A pergunta é semelhante a esta para matrizes)
javascript
abhijit
fonte
fonte
Respostas:
Você pode percorrer o objeto:
Se você estiver preocupado com a remoção dessa propriedade que não está executando a cadeia de tipos de objeto do objeto, você também pode:
Algumas notas sobre nulo vs indefinido:
fonte
Usando alguns ES6 / ES2015 :
1) Uma linha simples para remover os itens em linha sem atribuição:
jsbin
2) Este exemplo foi removido ...
3) Primeiro exemplo escrito como uma função:
jsbin
4) Esta função também utiliza recursão para excluir itens de objetos aninhados:
jsbin
4b) É semelhante a 4), mas em vez de alterar o objeto de origem diretamente, ele retorna um novo objeto.
5) Uma abordagem funcional para 4b) com base na resposta de @ MichaelJ.Zoidl usando
filter()
ereduce()
. Este também retorna um novo objeto:jsbin
6) O mesmo que 4), mas com o ES7 / 2016
Object.entries()
.5b) Outra versão funcional que usa recursão e retorna um novo objeto com o ES2019
Object.fromEntries()
:7) O mesmo que 4), mas na planície ES5 :
jsbin
fonte
keys
de umobject
, portanto,o
ek
é óbvio. Mas acho que é uma questão de gosto.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; }, {})
Se você estiver usando lodash ou underscore.js, aqui está uma solução simples:
Isso funcionará apenas com lodash 4, pré lodash 4 ou underscore.js, use
_.pick(obj, _.identity)
;fonte
_.omit(obj, _.isUndefined)
é melhor._.isUndefined
não omite nulos, use_.omitBy(obj, _.isNil)
para omitir ambosundefined
enull
Forros um mais curtos para ES6 +
Filtrar todos os valores Falsas (
""
,0
,false
,null
,undefined
)Filtro
null
eundefined
valores:Filtrar SOMENTE
null
Filtrar SOMENTE
undefined
Soluções Recursivas: Filtros
null
eundefined
Para objetos:
Para objetos e matrizes:
fonte
v == null
fará check contraundefined
enull
.cleanEmpty
soluções recursivas retornarão um objeto vazio{}
para objetos DateSe alguém precisa de uma versão recursiva da resposta de Owen (e de Eric), aqui está:
fonte
hasOwnProperty
usandoif(test.hasOwnProperty(i)) { ... }
JSON.stringify remove as chaves indefinidas.
fonte
null
ser tratado comoundefined
usar a função de substituição, para obter mais informações, consulte esta resposta: stackoverflow.com/questions/286141/…null
valores. Tente:let a = { b: 1, c: 0, d: false, e: null, f: undefined, g: [], h: {} }
e depoisconsole.log(removeUndefined(a))
. A pergunta era sobreundefined
enull
valores.Você provavelmente está procurando a
delete
palavra - chave.fonte
A solução Lodash mais simples possível para retornar um objeto com os valores
null
eundefined
filtrados._.omitBy(obj, _.isNil)
fonte
Você pode usar uma combinação de
JSON.stringify
seu parâmetro substituto eJSON.parse
transformá-lo novamente em um objeto. O uso desse método também significa que a substituição é feita em todas as chaves aninhadas nos objetos aninhados.Objeto de exemplo
Função Replacer
Limpe o objeto
Exemplo de CodePen
fonte
Usando Ramda # pickBy você vai remover todos
null
,undefined
efalse
valores:Como @manroe apontou, para manter os
false
valores useisNil()
:fonte
(v) => !R.isNil(v)
é provavelmente uma escolha melhor para a pergunta do OP, uma vez quefalse
ou outros valores Falsas também seria rejeitado porR.identity
Abordagem funcional e imutável, sem
.filter
e sem a criação de mais objetos do que o necessáriofonte
obj[key] === undefined
porobj[key] === undefined || obj[key] === null
const omitFalsy = obj => Object.keys(obj).reduce((acc, key) => ({ ...acc, ...(obj[key] && { [key]: obj[key] }) }), {});
Você pode fazer uma remoção recursiva em uma linha usando o argumento substituto de json.stringify
Uso:
Como mencionado no comentário de Emmanuel, essa técnica funcionou apenas se sua estrutura de dados contiver apenas tipos de dados que podem ser colocados no formato JSON (cadeias, números, listas, etc.).
(Esta resposta foi atualizada para usar o novo operador Nullish Coalescing dependendo das necessidades de apoio navegador que você pode querer usar esta função em vez disso:.
(k,v) => v!=null ? v : undefined
)fonte
NaN
paranull
que não são removidos.você pode fazer mais curto com
!
condiçãoLembre-se de usar: como @semicolor anuncia nos comentários: Isso também excluiria propriedades se o valor fosse uma sequência vazia, falsa ou zero
fonte
[null, undefined].includes(r[k])
vez de!r[k]
.Solução pura ES6 mais curta, converta-a em uma matriz, use a função de filtro e converta-a novamente em um objeto. Também seria fácil fazer uma função ...
Btw. com isso,
.length > 0
verifico se existe uma string / matriz vazia, para remover as chaves vazias.JS BIN https://jsbin.com/kugoyinora/edit?js,console
fonte
null
eundefined
seria mais simples usar apenasMY_OBJECT[f] != null
. Sua solução atual remove tudo, mas não vazias cordas / listas e gera um erro quando os valores sãonull
filter
's, seria mais legível.omit
não, você precisa verificar obj existe antes de chamarObject.keys
:const omit = (obj, filter) => obj && Object.keys(obj).filter(key => !filter(obj[key])).reduce((acc,key) => {acc[key] = obj[key]; return acc}, {});
Se você deseja 4 linhas de uma solução ES7 pura:
Ou se você preferir uma versão mais legível:
Isso preservará os valores booleanos e também limpará as matrizes. Ele também preserva o objeto original retornando uma cópia limpa.
fonte
Eu tenho o mesmo cenário no meu projeto e consegui usando o método a seguir.
Funciona com todos os tipos de dados, poucos mencionados acima não funcionam com data e matrizes vazias.
removeEmptyKeysFromObject.js
passar qualquer objeto para esta função removeEmptyKeysFromObject ()
fonte
Para uma pesquisa profunda, usei o seguinte código, talvez seja útil para qualquer pessoa que esteja olhando para essa pergunta (não é utilizável para dependências cíclicas):
fonte
Se você não quiser fazer a mutação no local, mas retornar um clone com o nulo / indefinido removido, poderá usar a função de redução do ES6.
fonte
Em vez de excluir a propriedade, você também pode criar um novo objeto com as chaves que não são nulas.
fonte
Para piggypack na resposta de Ben sobre como resolver esse problema usando o lodash
_.pickBy
, você também pode resolvê-lo na biblioteca irmã: Underscore.js 's_.pick
.Veja: Exemplo JSFiddle
fonte
um auxiliar de redução pode fazer o truque (sem verificação de tipo) -
fonte
Se alguém precisar remover
undefined
valores de um objeto com pesquisa profunda usandolodash
, aqui está o código que estou usando. É bastante simples modificá-lo para remover todos os valores vazios (null
/undefined
).fonte
Com o Lodash:
fonte
Se você usa eslint e deseja evitar tropeçar na regra no-param-reassign, é possível usar Object.assign em conjunto com .reduce e um nome de propriedade calculado para uma solução ES6 bastante elegante:
fonte
Aqui está uma maneira funcional de remover
nulls
de um Objeto usando o ES6 sem alterar o objeto usando apenasreduce
:fonte
stripNulls
função, ele usa uma referência de fora do escopo da função acumulador; e também mistura as preocupações filtrando a função acumulador. Eg (por exemploObject.entries(o).filter(([k,v]) => v !== null).reduce((o, [k, v]) => {o[k] = v; return o;}, {});
) Sim, eleVocê também pode usar a
...
sintaxe de propagação usandoforEach
algo como isto:fonte
Objeto limpo no lugar
Função pura
fonte
Podemos usar JSON.stringify e JSON.parse para remover atributos em branco de um objeto.
fonte
{} != {}
e[] != []
), mas de outra forma a abordagem é válidaAqui está uma função recursiva abrangente (originalmente baseada na de @chickens) que:
defaults=[undefined, null, '', NaN]
USO:
fonte
Se você preferir a abordagem pura / funcional
fonte