Como faço para remover elementos vazios de uma matriz em JavaScript?
Existe uma maneira simples ou preciso fazer um loop e removê-los manualmente?
javascript
arrays
node.js
Tamas Czinege
fonte
fonte
var a = [,,]
evar a = [undefined, undefined]
. O primeiro é realmente vazio, mas o segundo realmente tem duas chaves, mas comundefined
valores.Respostas:
Edição: Esta pergunta foi respondida quase nove anos atrás, quando não havia muitos métodos internos úteis no
Array.prototype
.Agora, certamente, eu recomendaria que você usasse o
filter
métodoLembre-se de que esse método retornará uma nova matriz com os elementos que passam nos critérios da função de retorno de chamada fornecida a ela.
Por exemplo, se você deseja remover
null
ouundefined
valores:Depende do que você considera "vazio", por exemplo, se você estivesse lidando com cadeias, a função acima não removeria elementos que sejam cadeias vazias.
Um padrão típico que vejo frequentemente utilizado é remover elementos que são Falsas , que incluem uma cadeia vazia
""
,0
,NaN
,null
,undefined
, efalse
.Você pode passar para o
filter
método, aBoolean
função construtora ou retornar o mesmo elemento na função de critério de filtro, por exemplo:Ou
Nos dois aspectos, isso funciona porque o
filter
método, no primeiro caso, chama oBoolean
construtor como uma função, convertendo o valor e, no segundo caso, ofilter
método internamente transforma implicitamente o valor de retorno do retorno de chamadaBoolean
.Se você estiver trabalhando com matrizes esparsas e estiver tentando se livrar dos "buracos", poderá usar o
filter
método que passa um retorno de chamada que retorna verdadeiro, por exemplo:Resposta antiga: não faça isso!
Eu uso esse método, estendendo o protótipo Array nativo:
Ou você pode simplesmente enviar os elementos existentes para outra matriz:
fonte
splice
chamada é muito cara em navegadores mais antigos porque eles precisam renumerar todas as chaves da matriz para diminuir a diferença.Array.prototype
usoObject.defineProperty
para tornar a nova função uma propriedade não enumerável e, em seguida, evitar o impacto no desempenho causado pela inserção.hasOwnProperty
de cada loop.Maneiras simples:
ou - (apenas para itens de matriz única do tipo "texto")
ou - Maneira clássica: iteração simples
via jQuery:
UPDATE - apenas outra maneira rápida e legal de usar o ES6:
Remover valores vazios
fonte
arr = arr.filter(function(n){return n; });
foo.join("").split("")
só parece funcionar se as cordas são caracteres simplesarr.filter(e=>e)
e isso pode ser preso por mapa, reduzir, etc.Se você precisar remover TODOS os valores vazios ("", nulo, indefinido e 0):
Para remover valores vazios e quebras de linha:
Exemplo:
Retorna:
UPDATE (baseado no comentário de Alnitak)
Em algumas situações, você pode manter "0" na matriz e remover qualquer outra coisa (nula, indefinida e ""), desta maneira:
Retorna:
fonte
function(e){return !!e}
!!e
irá incluir NaN (ao contrário de 0), ondee
não seria (como 0).var myarr=[1, 2,, 3,, 3,undefined,,"",,0, 4,, 4,, 5,, 6,,,,].filter(Boolean);
remove indefinido "" e 0Simplesmente um forro:
ou usando underscorejs.org :
fonte
Boolean
funciona como uma função ...Boolean
como uma função, ela simplesmente retornarátrue
ou sefalse
o valor é verdadeiro / falso.(true).constructor === Boolean
,. E então me diga se podemos fazer isso com outros build-ins em JS. ;)) (obviamente excluiu os outros 5 construtores incorporados. (String, Matriz, Objeto, Função, Número))Se você possui o Javascript 1.6 ou posterior, pode usar
Array.filter
umareturn true
função trivial de retorno de chamada, por exemplo:desde
.filter
automaticamente ignora elementos na matriz original faltando.A página MDN vinculada acima também contém uma boa versão de verificação de erros
filter
que pode ser usada em intérpretes JavaScript que não suportam a versão oficial.Observe que isso não removerá
null
entradas nem entradas com umundefined
valor explícito , mas o OP solicitou especificamente entradas "ausentes".fonte
undefined
como seu valor dado.Para remover furos, você deve usar
Para remover os valores de furo e, falsy (nulo, indefinido, 0, -0, NaN, "", false, document.all):
Para remover furo, nulo e indefinido:
fonte
[, ,]
arr.filter(x => x)
, o JS verificará se x é verdadeiro ou falso, ou sejaif (x)
, portanto, apenas o valor verdadeiro será atribuído à nova lista.A maneira limpa de fazer isso.
fonte
undefined
; isso basicamente remove todos os valores falsos.ES6 simples
fonte
[1, 'two', null, undefined, , NaN, false, true, 0].filter(v => v)
.Com Sublinhado / Lodash:
Caso de uso geral:
Com vazios:
Consulte a documentação do lodash para sem .
fonte
Apenas o
ES6
método das versões mais recentes e mais recentes, assume que a matriz está abaixo:Maneira simples:
fonte
Se o uso de uma biblioteca é uma opção, sei que o underscore.js possui uma função chamada compact () http://documentcloud.github.com/underscore/, mas também possui várias outras funções úteis relacionadas a matrizes e coleções.
Aqui está um trecho da documentação:
fonte
@Alnitak
Na verdade, o Array.filter funciona em todos os navegadores se você adicionar algum código extra. Ver abaixo.
Este é o código que você precisa adicionar ao IE, mas o filtro e a programação funcional são imo.
fonte
Como ninguém mais o mencionou e a maioria das pessoas tem sublinhado incluído no projeto, você também pode usá-lo
_.without(array, *values);
.fonte
ES6:
fonte
Você pode achar mais fácil fazer um loop sobre sua matriz e criar uma nova matriz com os itens que deseja manter da matriz do que tentar fazer loop e emendar como foi sugerido, desde que modifique o comprimento da matriz enquanto ela estiver em loop. over pode apresentar problemas.
Você poderia fazer algo assim:
Na verdade, aqui está uma solução mais genérica:
Você entendeu a idéia - você poderia ter outros tipos de funções de filtro. Provavelmente mais do que você precisa, mas eu estava me sentindo generoso ...;)
fonte
E sobre isso (ES6): Para remover o valor de Falsy de uma matriz.
fonte
Você deve usar o filtro para obter a matriz sem elementos vazios. Exemplo no ES6
fonte
Estou simplesmente juntar a minha voz ao acima “chamar ES5 de
Array..filter()
com um construtor global” golf-hack, mas eu sugiro usarObject
em vez deString
,Boolean
ouNumber
como sugerido acima.Especificamente, os ES5
filter()
já não são acionados paraundefined
elementos dentro da matriz; portanto, uma função que retorna universalmentetrue
, que retorna todos osfilter()
hits dos elementos , necessariamente retornará apenas nãoundefined
elementos:No entanto, escrever
...(function(){return true;})
é mais longo que escrever...(Object)
; e o valor de retorno doObject
construtor será, sob qualquer circunstância , algum tipo de objeto. Diferentemente dos construtores de boxe primitivos sugeridos acima, nenhum valor de objeto possível é falsey e, portanto, em um ambiente booleano,Object
é uma abreviação parafunction(){return true}
.fonte
someArray.filter(String);
é realmente equivalente asomeArray.filter(function(x){ return String(x); });
. Se você deseja remover todos os valores falsos,someArray.filter(Boolean);
trabalha para remover 0, -0, NaN, false, '', null e indefinido.Object
construtor em oposição aoreturn true
método. @robocat, o OP solicitou a remoção de elementos vazios, não nulos.Ao usar a resposta mais votada acima, primeiro exemplo, eu estava obtendo caracteres individuais para comprimentos de string maiores que 1. Abaixo está minha solução para esse problema.
Em vez de não retornar se indefinido, retornamos se o comprimento for maior que 0. Espero que ajude alguém lá fora.
Devoluções
fonte
["", "some string yay", "", "", 123, "Other string yay"].filter(function(n){ return n.length > 0}) //gives your same result removing 123
Substituindo essa função. .. com String, ironicamente, deixa números em, mas daria o mesmo resultado em sua matriz especificada.fonte
Que tal:
fonte
join() === join(',')
:)Isso funciona, eu testei no AppJet (você pode copiar e colar o código em seu IDE e pressionar "recarregar" para vê-lo funcionar, não precisa criar uma conta)
fonte
for ... in
que realmente causa o pulo dos elementos ausentes. O testeundefined
serve apenas para remover elementos reais que estão explicitamente definidos para esse valor.Outra maneira de fazer isso é tirar proveito da propriedade length da matriz: empacote os itens não nulos à esquerda da matriz e reduza o comprimento. É um algoritmo no local - não aloca memória, muito ruim para o coletor de lixo - e possui um comportamento muito bom de melhor / média / pior caso.
Essa solução, comparada com outras aqui, é entre 2 a 50 vezes mais rápida no Chrome e 5 a 50 vezes mais rápida no Firefox, como você pode ver aqui: http://jsperf.com/remove-null-items-from-array
O código abaixo adiciona o método não-enumerável 'removeNull' à matriz, que retorna 'this' para encadeamento:
fonte
arr.filter(e => e)
.smart
- como o verbo, para causar uma dor aguda e aguda. Isso é relevante devido à dor física se eu armar meu telefone devido ao seu comentário.retorna
fonte
'Uso indevido' do loop for ... in (membro do objeto). => Somente os valores verdadeiros aparecem no corpo do loop.
fonte
for ... in
é o que remove as chaves indefinidos a partir da matriz, mas você tem realmente nenhum código aqui para o contrário aceitar apenas valores "truthy"Isso pode ajudá-lo: https://lodash.com/docs/4.17.4#remove
fonte
Resultado:
Ele removerá o elemento vazio da matriz e exibirá outro elemento.
fonte
Removendo todos os elementos vazios
Se uma matriz contiver objetos, matrizes e seqüências de caracteres vazias ao lado de outros elementos vazios, podemos removê-los com:
Compactação simples (removendo elementos vazios de uma matriz)
Com ES6:
Com Javascript simples ->
fonte
Filtrando entradas inválidas com uma expressão regular
fonte
A melhor maneira de remover elementos vazios é usar
Array.prototype.filter()
, como já mencionado em outras respostas.Infelizmente,
Array.prototype.filter()
não é suportado pelo IE <9. Se você ainda precisar oferecer suporte ao IE8 ou uma versão ainda mais antiga do IE, poderá usar o seguinte polyfill para adicionar suporteArray.prototype.filter()
nesses navegadores:fonte