Eu tenho um objeto Javascript como:
var my_object = { a:undefined, b:2, c:4, d:undefined };
Como remover todas as propriedades indefinidas? Atributos falsos devem permanecer.
javascript
object
lodash
JLavoie
fonte
fonte
_.pickBy(obj, _.identity);
false
valorVocê pode simplesmente encadear
_.omit()
com_.isUndefined
e_.isNull
composições e obter o resultado com uma avaliação lenta.Demo
Atualização 14 de março de 2016 :
Conforme mencionado por dylants na seção de comentários, você deve usar a
_.omitBy()
função, pois ela usa um predicado em vez de uma propriedade. Você deve usar isso na versão lodash4.0.0
e acima.DEMO
Atualização 1 de junho de 2016 :
Como comentado por Max Truxa , o lodash já forneceu uma alternativa
_.isNil
, que verifica os doisnull
eundefined
:fonte
omitBy
função em vez deomit
. Então_(my_object).omitBy(_.isUndefined).omitBy(_.isNull).value();
_.isNil
vez de encadear_.isUndefined
e_.isNull
. Isso o torna ainda mais curto:var result = _.omitBy(my_object, _.isNil);
omitBy
desempenho de Lodash é menos eficiente do quepickBy
, portanto, este último deve ser preferido, e a condição na função iterada é revertida. A resposta aceita acima acertou.null
eundefined
valores. Oidentity
predicado também removeráfalse
valores; portanto, se você simplesmente o basear na intenção da pergunta, não vejo problema com a minha resposta. Além disso, se estivermos falando sobre "desempenho",omitBy
simplesmente chamepickBy
com umidentity
predicado negado , por padrão. Portanto, em termos de desempenho, é muito pequeno para ser significativo.se você estiver usando lodash, poderá
_.compact(array)
remover todos os valores falsamente de uma matriz.https://lodash.com/docs/4.17.4#compact
fonte
_.pickBy(object, _.isNumber)
nesse caso.A resposta correta é:
Isso resulta em:
A alternativa dada aqui por outras pessoas:
Também removerá
false
valores que não são desejados aqui.fonte
{"a":1,"b":{"a":1,"b":null,"c":undefined}}
, a propriedade object.bb
, 'c' não será removidaSomente:
O exposto acima não leva em consideração os
null
valores, pois estão ausentes do exemplo original e mencionados apenas no assunto, mas deixo-o como é elegante e pode ter seus usos.Aqui está o exemplo completo, menos conciso, mas mais completo.
fonte
_.omitBy
.Para concluir as outras respostas, no lodash 4, para ignorar apenas indefinido e nulo (E não propriedades como
false
), você pode usar um predicado em_.pickBy
:_.pickBy(obj, v !== null && v !== undefined)
Exemplo abaixo:
fonte
0
,''
,false
valores. Além disso, você pode reduzir o retorno de chamada parav => v != null
.De acordo com os documentos da lodash:
Além disso, você pode filtrar todos os nulos
fonte
Para objetos aninhados profundos, você pode usar meu snippet para lodash> 4
fonte
Encontrei um problema semelhante ao remover
undefined
de um objeto (profundamente) e descobri que, se você estiver bem em converter seu objeto antigo simples e usar JSON, uma função auxiliar rápida e suja seria semelhante a esta:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Description
"... Se indefinido, uma função ou um símbolo for encontrado durante a conversão, ele será omitido (quando encontrado em um objeto) ou censurado para nulo (quando encontrado em uma matriz)."
fonte
com JavaScript puro: (embora Object.entries seja ES7, Object.assign é ES6; mas o ES5 equivalente usa Object.keys apenas também deve ser possível); também observe
v != null
verificações nulas e indefinidas;Edit: esta abaixo é a versão apenas com ES5 Object.keys: mas geralmente com ES7 no nó v8 é bastante agradável ;-)
Atualização em outubro de 2017 : com o Node v8 (desde a v8.3 ou mais) agora ele tem a construção de propagação de objeto:
ou em apenas uma redução:
Atualização: alguém quer recursivo? também não é tão difícil, basta uma verificação adicional de isObject e chamar-se recursivamente:
minha conclusão: se o Javascript puro puder fazer, eu evitaria quaisquer dependências da biblioteca de terceiros:
fonte
Como alguns de vocês podem ter chegado à pergunta que quer apenas remover especificamente
undefined
, você pode usar:uma combinação dos métodos Lodash
o
rundef
pacote, que remove apenasundefined
propriedadesSe você precisar remover propriedades recursivamente
undefined
, orundef
pacote também terá umarecursive
opção.Veja a documentação para mais detalhes.
fonte
Aqui está a abordagem lodash que eu adotaria:
A função pairs () transforma o objeto de entrada em uma matriz de matrizes de chave / valor. Você faz isso para que seja mais fácil usar rejeitar () para eliminar
undefined
enull
valores. Depois, você fica com pares que não foram rejeitados e são inseridos para zipObject () , que reconstrói seu objeto para você.fonte
Levando em conta que
undefined == null
podemos escrever da seguinte maneira:Exemplo de JSBin
fonte
pickBy usa identidade por padrão:
fonte
Maneira mais curta (lodash v4):
fonte
Com lodash (ou sublinhado), você pode fazer
Caso contrário, com JavaScript vanilla, você pode fazer
Não usar um teste de falsey, porque não apenas "indefinido" ou "nulo" será rejeitado , também há outro valor de falsey como "false", "0", string vazia, {}. Assim, apenas para torná-lo simples e compreensível, optei por usar a comparação explícita, como codificado acima.
fonte
Para omitir todos os valores de falsey , mas manter os primitivos booleanos que esta solução ajuda.
fonte
fonte
Eu usaria sublinhado e cuidaria de cadeias vazias também:
jsbin .
fonte
Para objetos e matrizes aninhados profundos. e excluir valores vazios da string e do NaN
resultado:
fonte
Eu gosto de usar _.pickBy, porque você tem total controle sobre o que está removendo:
Fonte: https://www.codegrepper.com/?search_term=lodash+remove+undefined+values+from+object
fonte
Para aqueles que estão chegando aqui procurando remover de uma matriz de objetos e usando o lodash, podem fazer algo assim:
Nota: Você não precisa destruir se não quiser.
fonte