Remover elementos vazios de uma matriz em Javascript

1145

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?

Tamas Czinege
fonte
14
Seria útil se sua pergunta tivesse especificado exatamente o que você quer dizer com "elementos vazios", já que a maioria das respostas aqui interpreta isso incorretamente (IMHO) como elementos "falsey". Nota: existe uma diferença entre o que você recebe var a = [,,]e var a = [undefined, undefined]. O primeiro é realmente vazio, mas o segundo realmente tem duas chaves, mas com undefinedvalores.
Alnitak

Respostas:

1065

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étodo

Lembre-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 nullou undefinedvalores:

var array = [0, 1, null, 2, "", 3, undefined, 3,,,,,, 4,, 4,, 5,, 6,,,,];

var filtered = array.filter(function (el) {
  return el != null;
});

console.log(filtered);

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, e false.

Você pode passar para o filtermétodo, a Booleanfunção construtora ou retornar o mesmo elemento na função de critério de filtro, por exemplo:

var filtered = array.filter(Boolean);

Ou

var filtered = array.filter(function(el) { return el; });

Nos dois aspectos, isso funciona porque o filtermétodo, no primeiro caso, chama o Booleanconstrutor como uma função, convertendo o valor e, no segundo caso, o filtermétodo internamente transforma implicitamente o valor de retorno do retorno de chamada Boolean.

Se você estiver trabalhando com matrizes esparsas e estiver tentando se livrar dos "buracos", poderá usar o filtermétodo que passa um retorno de chamada que retorna verdadeiro, por exemplo:

var sparseArray = [0, , , 1, , , , , 2, , , , 3],
    cleanArray = sparseArray.filter(function () { return true });

console.log(cleanArray); // [ 0, 1, 2, 3 ]

Resposta antiga: não faça isso!

Eu uso esse método, estendendo o protótipo Array nativo:

Array.prototype.clean = function(deleteValue) {
  for (var i = 0; i < this.length; i++) {
    if (this[i] == deleteValue) {         
      this.splice(i, 1);
      i--;
    }
  }
  return this;
};

test = new Array("", "One", "Two", "", "Three", "", "Four").clean("");
test2 = [1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,];
test2.clean(undefined);

Ou você pode simplesmente enviar os elementos existentes para outra matriz:

// Will remove all falsy values: undefined, null, 0, false, NaN and "" (empty string)
function cleanArray(actual) {
  var newArray = new Array();
  for (var i = 0; i < actual.length; i++) {
    if (actual[i]) {
      newArray.push(actual[i]);
    }
  }
  return newArray;
}

cleanArray([1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,]);
CMS
fonte
110
AVISO: A segunda opção removerá todos os elementos de uma matriz considerada "falsa", ou seja, os valores de falso, 0, nulo e indefinido. Essa matriz acabaria sem nada: [null ,,, 0,, ​​0,0,0, false, null, 0] mesmo que eu queira os elementos com valores 0, como nesta matriz: [ 1,0,1,0,0,1]
Jason Bunting
5
Eu percebo isso - e é por isso que só falei da segunda opção. Quanto ao primeiro, tem um escopo tão restrito que hesitaria em fazer parte do protótipo do Array. Veja a resposta de Alnitak nesta página para algo que seria mais ideal. O seu permite encadeamento, obviamente.
Jason Bunting
1
Sua primeira solução é muito boa se você não tiver acesso ao método "filter". Senão, acredito que a resposta de Alnitak seja melhor.
Joe Pineda
2
@AlfaTek - além dos navegadores mais novos, o número 2 terá o melhor desempenho, porque matrizes em JS não são realmente matrizes. A splicechamada é muito cara em navegadores mais antigos porque eles precisam renumerar todas as chaves da matriz para diminuir a diferença.
Alnitak 10/05
1
@ David, não, no código moderno você deve estender com segurança oArray.prototype uso Object.definePropertypara tornar a nova função uma propriedade não enumerável e, em seguida, evitar o impacto no desempenho causado pela inserção .hasOwnPropertyde cada loop.
Alnitak
1381

Maneiras simples:

var arr = [1,2,,3,,-3,null,,0,,undefined,4,,4,,5,,6,,,,];


arr.filter(n => n)
// [1, 2, 3, -3, 4, 4, 5, 6]

arr.filter(Number) 
// [1, 2, 3, -3, 4, 4, 5, 6]

arr.filter(Boolean) 
// [1, 2, 3, -3, 4, 4, 5, 6]

ou - (apenas para itens de matriz única do tipo "texto")

['','1','2',3,,'4',,undefined,,,'5'].join('').split(''); 
// output:  ["1","2","3","4","5"]

ou - Maneira clássica: iteração simples

var arr = [1,2,null, undefined,3,,3,,,0,,,[],,{},,5,,6,,,,],
    len = arr.length, i;

for(i = 0; i < len; i++ )
    arr[i] && arr.push(arr[i]);  // copy non-empty values to the end of the array

arr.splice(0 , len);  // cut the array and leave only the non-empty values

arr // [1,2,3,3,[],Object{},5,6]


via jQuery:

var arr = [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,];

arr = $.grep(arr,function(n){ return n == 0 || n });

arr // [1, 2, 3, 3, 0, 4, 4, 5, 6]


UPDATE - apenas outra maneira rápida e legal de usar o ES6:

var arr = [1,2,null, undefined,3,,3,,,0,,,4,,4,,5,,6,,,,], 
    temp = [];

for(let i of arr)
    i && temp.push(i); // copy each non-empty value to the 'temp' array

arr = temp;

arr // [1, 2, 3, 3, 4, 4, 5, 6]

Remover valores vazios

['foo', '',,,'',,null, ' ', 3, true, [], [1], {}, undefined, ()=>{}].filter(String)

// ["foo", null, " ", 3, true, [1], Object {}, undefined, ()=>{}]
vsync
fonte
34
O suporte mais antigo do IE ao filtro é o modo de padrões do IE9.
yincrash
14
para javascript puro, deveria serarr = arr.filter(function(n){return n; });
iluminado
19
foo.join("").split("")só parece funcionar se as cordas são caracteres simples
Atav32
9
Seu código JavaScript puro possui um bug. Se a matriz tiver um valor com "0", o valor será filtrado porque "0" é falso. O que você deseja é: arr.filter (function (n) {return (n! == undefined && n! == null);});
precisa saber é o seguinte
5
ES6 pode fazê-lo ainda mais simples arr.filter(e=>e)e isso pode ser preso por mapa, reduzir, etc.
Sheepy
242

Se você precisar remover TODOS os valores vazios ("", nulo, indefinido e 0):

arr = arr.filter(function(e){return e}); 

Para remover valores vazios e quebras de linha:

arr = arr.filter(function(e){ return e.replace(/(\r\n|\n|\r)/gm,"")});

Exemplo:

arr = ["hello",0,"",null,undefined,1,100," "]  
arr.filter(function(e){return e});

Retorna:

["hello", 1, 100, " "]

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:

arr.filter(function(e){ return e === 0 || e });

Retorna:

["hello", 0, 1, 100, " "]
lepe
fonte
Sim, isso é legal porque remove "" também.
Vladimirs
3
A função de teste pode ser um pouco mais explícita:function(e){return !!e}
Koen.
4
@ Koen Por favor, note que !!eirá incluir NaN (ao contrário de 0), onde enão seria (como 0).
Sheepy
Na verdade, não responde à pergunta que foi feita.
Alnitak
2
O uso OR var myarr=[1, 2,, 3,, 3,undefined,,"",,0, 4,, 4,, 5,, 6,,,,].filter(Boolean);remove indefinido "" e 0
Mark Schultheiss
134

Simplesmente um forro:

[1, false, "", undefined, 2].filter(Boolean); // [1, 2]

ou usando underscorejs.org :

_.filter([1, false, "", undefined, 2], Boolean); // [1, 2]
// or even:
_.compact([1, false, "", undefined, 2]); // [1, 2]
andlrc
fonte
1
Isso é muito legal - no entanto, tenho uma nova pergunta: parece que você está usando um nome de classe como uma chamada de função - isso é típico? Eu não vi isso antes e não sei ao certo por que a passagem Booleanfunciona como uma função ...
Andrew
8
Se você tratar Booleancomo uma função, ela simplesmente retornará trueou se falseo valor é verdadeiro / falso.
7133 andlrc
8
Você não está tratando booleano como uma função; que é uma função. (Uma função completamente normal, exceto pela implementação nativa.) Alguém precisa fazer uma pequena pesquisa sobre o modelo de objeto JavaScript. ;)
ELLIOTTCABLE
Só vou deixar isso aqui (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))
andlrc
1
Falhará ambos, se há um valor 0 na matriz
Sai Ram
129

Se você possui o Javascript 1.6 ou posterior, pode usar Array.filteruma return truefunção trivial de retorno de chamada, por exemplo:

arr = arr.filter(function() { return true; });

desde .filterautomaticamente 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 filterque pode ser usada em intérpretes JavaScript que não suportam a versão oficial.

Observe que isso não removerá nullentradas nem entradas com um undefinedvalor explícito , mas o OP solicitou especificamente entradas "ausentes".

Alnitak
fonte
Você está certo! Pode ser tão simples quanto isso (e funciona!): Test3 = [1,2,, 3,, 3 ,,,, 7 ,,, 7 ,,, 0 ,,, 4,, 4,, 5 ,, 6, indefinido ,, nulo ,,]; printp ("Usando a filtragem nativa da matriz:", test3.filter (função (valor) {return (value == undefined)? 0: 1;}));
9118 Joe Pineda
3
Como um Alnitak disse, que têm o código que pode ser usado no caso de não ter JS 1.6 disponível
Samir Alibhai
3
@katsh eu esclareceu - o código acima faz o trabalho para remover as entradas para os quais existe nenhum valor em tudo, que (eu tenho posteriormente) aprendi é semanticamente diferente para o caso de uma chave que existe, mas que tem undefinedcomo seu valor dado.
Alnitak
4
Para remover entradas indefinidas ou nulas, faça uma pequena modificação ... arr = arr.filter (function (v) {return v;});
Alan CN
4
@ AlanCN você perdeu completamente o meu ponto. O OP pediu para remover as entradas ausentes , enquanto a maioria das respostas aqui (incorretamente) remove as entradas "falsey".
Alnitak
65

Para remover furos, você deve usar

arr.filter(() => true)
arr.flat(0) // Currently stage 3, check compatibility before using this

Para remover os valores de furo e, falsy (nulo, indefinido, 0, -0, NaN, "", false, document.all):

arr.filter(x => x)

Para remover furo, nulo e indefinido:

arr.filter(x => x != null)

arr = [, null, (void 0), 0, -0, NaN, false, '', 42];
console.log(arr.filter(() => true)); // [null, (void 0), 0, -0, NaN, false, '', 42]
console.log(arr.filter(x => x)); // [42]
console.log(arr.filter(x => x != null)); // [0, -0, NaN, false, "", 42]

tsh
fonte
3
Isso deve estar alto na resposta. Você pode expandir o que você quer dizer com buracos / buraco ..?
Samayo
2
@samayo furos são itens de matriz não preenchidas, ou seja[, ,]
Jimmy Obonyo Abor
Ao usar arr.filter(x => x), o JS verificará se x é verdadeiro ou falso, ou seja if (x), portanto, apenas o valor verdadeiro será atribuído à nova lista.
KuanYu Chu
56

A maneira limpa de fazer isso.

var arr = [0,1,2,"Thomas","false",false,true,null,3,4,undefined,5,"end"];
arr = arr.filter(Boolean);
// [1, 2, "Thomas", "false", true, 3, 4, 5, "end"]
Tomás Senart
fonte
5
Elementos vazios são undefined; isso basicamente remove todos os valores falsos.
Pimvdb
33

ES6 simples

['a','b','',,,'w','b'].filter(v => v);
ML13
fonte
1
Isso não funciona: [1, 'two', null, undefined, , NaN, false, true, 0].filter(v => v).
Zipper
22

Com Sublinhado / Lodash:

Caso de uso geral:

_.without(array, emptyVal, otherEmptyVal);
_.without([1, 2, 1, 0, 3, 1, 4], 0, 1);

Com vazios:

_.without(['foo', 'bar', '', 'baz', '', '', 'foobar'], '');
--> ["foo", "bar", "baz", "foobar"]

Consulte a documentação do lodash para sem .

c4urself
fonte
O problema com #compact é que ele remove quaisquer valores falsos. Portanto, se sua matriz contiver 0 valores, eles também serão removidos.
Samuel Brandão
21

Apenas o ES6método das versões mais recentes e mais recentes, assume que a matriz está abaixo:

 const arr = [1,2,3,undefined,4,5,6,undefined,7,8,undefined,undefined,0,9];

Maneira simples:

 const clearArray = arr.filter( i => i );
AmerllicA
fonte
16

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:

_.compacto (matriz)

Retorna uma cópia da matriz com todos os valores falsos removidos. No JavaScript, falso, nulo, 0, "", indefinido e NaN são todos falsos.

_.compacto ([0, 1, falso, 2, '', 3]);

=> [1, 2, 3]

Luis Perez
fonte
Além disso, elimina elementos não vazios definidos como elementos 0.
Timothy Gu
15

@Alnitak

Na verdade, o Array.filter funciona em todos os navegadores se você adicionar algum código extra. Ver abaixo.

var array = ["","one",0,"",null,0,1,2,4,"two"];

function isempty(x){
if(x!=="")
    return true;
}
var res = array.filter(isempty);
document.writeln(res.toJSONString());
// gives: ["one",0,null,0,1,2,4,"two"]  

Este é o código que você precisa adicionar ao IE, mas o filtro e a programação funcional são imo.

//This prototype is provided by the Mozilla foundation and
//is distributed under the MIT license.
//http://www.ibiblio.org/pub/Linux/LICENSES/mit.license

if (!Array.prototype.filter)
{
  Array.prototype.filter = function(fun /*, thisp*/)
  {
    var len = this.length;
    if (typeof fun != "function")
      throw new TypeError();

    var res = new Array();
    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this)
      {
        var val = this[i]; // in case fun mutates this
        if (fun.call(thisp, val, i, this))
          res.push(val);
      }
    }

    return res;
  };
}
Erik Johansson
fonte
Essa deve ser a resposta aceita, pois funciona de maneira imediata. Muito obrigado.
Tony
@ Tony, não deveria, porque um elemento com uma string vazia não é o mesmo que um "elemento vazio", sendo este último o que o OP solicitou.
Alnitak
14

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);.

_.without(["text", "string", null, null, null, "text"], null)
// => ["text", "string", "text"]
Josh Bedo
fonte
12

ES6:

let newArr = arr.filter(e => e);
Kanan Farzali
fonte
8

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:

function removeFalsyElementsFromArray(someArray) {
    var newArray = [];
    for(var index = 0; index < someArray.length; index++) {
        if(someArray[index]) {
            newArray.push(someArray[index]);
        }
    }
    return newArray;
}

Na verdade, aqui está uma solução mais genérica:

function removeElementsFromArray(someArray, filter) {
    var newArray = [];
    for(var index = 0; index < someArray.length; index++) {
        if(filter(someArray[index]) == false) {
            newArray.push(someArray[index]);
        }
    }
    return newArray;
}

// then provide one or more filter functions that will 
// filter out the elements based on some condition:
function isNullOrUndefined(item) {
    return (item == null || typeof(item) == "undefined");
}

// then call the function like this:
var myArray = [1,2,,3,,3,,,,,,4,,4,,5,,6,,,,];
var results = removeElementsFromArray(myArray, isNullOrUndefined);

// results == [1,2,3,3,4,4,5,6]

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 ...;)

Jason Bunting
fonte
7

E sobre isso (ES6): Para remover o valor de Falsy de uma matriz.

var arr = [0,1,2,"test","false",false,true,null,3,4,undefined,5,"end"];

arr.filter((v) => (!!(v)==true));

//output:

//[1, 2, "test", "false", true, 3, 4, 5, "end"]
VIJAY P
fonte
6

Você deve usar o filtro para obter a matriz sem elementos vazios. Exemplo no ES6

const array = [1, 32, 2, undefined, 3];
const newArray = array.filter(arr => arr);
Gapur Kassym
fonte
3

Estou simplesmente juntar a minha voz ao acima “chamar ES5 de Array..filter()com um construtor global” golf-hack, mas eu sugiro usar Objectem vez de String, BooleanouNumber como sugerido acima.

Especificamente, os ES5 filter()já não são acionados para undefinedelementos dentro da matriz; portanto, uma função que retorna universalmente true, que retorna todos osfilter() hits dos elementos , necessariamente retornará apenas não undefinedelementos:

> [1,,5,6,772,5,24,5,'abc',function(){},1,5,,3].filter(function(){return true})
[1, 5, 6, 772, 5, 24, 5, 'abc', function (){}, 1, 5, 3]

No entanto, escrever ...(function(){return true;})é mais longo que escrever ...(Object); e o valor de retorno do Objectconstrutor 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 para function(){return true}.

> [1,,5,6,772,5,24,5,'abc',function(){},1,5,,3].filter(Object)
[1, 5, 6, 772, 5, 24, 5, 'abc', function (){}, 1, 5, 3]
ELLIOTTCABLE
fonte
1
CUIDADO: filter (String) e filter (Object) não filtram nulos ou números. Como um construtor também é uma função, você pode passar String para filtrar, ou seja, someArray.filter(String);é realmente equivalente a someArray.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.
robocat
1
Boa resposta, embora eu me pergunte sobre a sobrecarga de desempenho de chamar o Objectconstrutor em oposição ao return truemétodo. @robocat, o OP solicitou a remoção de elementos vazios, não nulos.
Alnitak
Prefiro a solução mais curta e mais clara, exceto em loops apertados. Preferência pessoal, suponho. (=
ELLIOTTCABLE
3

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.

var stringObject = ["", "some string yay", "", "", "Other string yay"];
stringObject = stringObject.filter(function(n){ return n.length > 0});

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

["some string yay", "Other string yay"]
John Miller
fonte
+1, pois isso é muito prático e exatamente o que eu normalmente preciso trabalhar com matrizes de string, mas lembre-se de que isso remove números (se não estiverem no formato de string), pois eles não têm um comprimento. ["", "some string yay", "", "", 123, "Other string yay"].filter(function(n){ return n.length > 0}) //gives your same result removing 123Substituindo essa função. .. com String, ironicamente, deixa números em, mas daria o mesmo resultado em sua matriz especificada.
precisa saber é
3
var data = [null, 1,2,3];
var r = data.filter(function(i){ return i != null; })

console.log(r) 

[1,2,3]

KARTHIKEYAN.A
fonte
Esta é a maneira obviamente correta de fazê-lo e deve estar no topo!
Martin Andersson
2

Que tal:

js> [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,].filter(String).join(',')
1,2,3,3,0,4,4,5,6
JessyNinja
fonte
6
join() === join(','):)
pimvdb
1

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)

/* appjet:version 0.1 */
function Joes_remove(someArray) {
    var newArray = [];
    var element;
    for( element in someArray){
        if(someArray[element]!=undefined ) {
            newArray.push(someArray[element]);
        }
    }
    return newArray;
}

var myArray2 = [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,];

print("Original array:", myArray2);
print("Clenased array:", Joes_remove(myArray2) );
/*
Returns: [1,2,3,3,0,4,4,5,6]
*/
Joe Pineda
fonte
1
Isso parece funcionar "por acidente", já que é o ato de enumerar as chaves via for ... inque realmente causa o pulo dos elementos ausentes. O teste undefinedserve apenas para remover elementos reais que estão explicitamente definidos para esse valor.
Alnitak
1

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:

var removeNull = function() {
    var nullCount = 0           ;
    var length    = this.length ;
    for (var i=0, len=this.length; i<len; i++) { if (!this[i]) {nullCount++} }
    // no item is null
    if (!nullCount) { return this}
    // all items are null
    if (nullCount == length) { this.length = 0; return this }
    // mix of null // non-null
    var idest=0, isrc=length-1;
    length -= nullCount ;                
    while (true) {
         // find a non null (source) slot on the right
         while (!this[isrc])  { isrc--; nullCount--; } 
         if    (!nullCount) { break }       // break if found all null
         // find one null slot on the left (destination)
         while ( this[idest]) { idest++  }  
         // perform copy
         this[idest]=this[isrc];
         if (!(--nullCount)) {break}
         idest++;  isrc --; 
    }
    this.length=length; 
    return this;
};  

Object.defineProperty(Array.prototype, 'removeNull', 
                { value : removeNull, writable : true, configurable : true } ) ;
GameAlchemist
fonte
Boa resposta, embora seja bom ver alguns casos de teste para mostrá-lo em ação!
Alnitak
2
Esta resposta é muito fascinante, mas me lembra de olhar para um computador construído em 1945, quando eu tenho um smartphone: arr.filter(e => e).
precisa saber é o seguinte
@ agm1984 seu smartphone não é inteligente
Hernán Eche
Isso pode depender da sua definição de 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.
agm1984
1
foo = [0, 1, 2, "", , false, 3, "four", null]

foo.filter(function(e) {
    return e === 0 ? '0' : e
})

retorna

[0, 1, 2, 3, "four"]
sqram
fonte
1

'Uso indevido' do loop for ... in (membro do objeto). => Somente os valores verdadeiros aparecem no corpo do loop.

// --- Example ----------
var field = [];

field[0] = 'One';
field[1] = 1;
field[3] = true;
field[5] = 43.68;
field[7] = 'theLastElement';
// --- Example ----------

var originalLength;

// Store the length of the array.
originalLength = field.length;

for (var i in field) {
  // Attach the truthy values upon the end of the array. 
  field.push(field[i]);
}

// Delete the original range within the array so that
// only the new elements are preserved.
field.splice(0, originalLength);
michael.zech
fonte
o código está correto, o comentário está errado. O ato de usar 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"
Alnitak
1

Isso pode ajudá-lo: https://lodash.com/docs/4.17.4#remove

var details = [
            {
                reference: 'ref-1',
                description: 'desc-1',
                price: 1
            }, {
                reference: '',
                description: '',
                price: ''
            }, {
                reference: 'ref-2',
                description: 'desc-2',
                price: 200
            }, {
                reference: 'ref-3',
                description: 'desc-3',
                price: 3
            }, {
                reference: '',
                description: '',
                price: ''
            }
        ];

        scope.removeEmptyDetails(details);
        expect(details.length).toEqual(3);

scope.removeEmptyDetails = function(details){
            _.remove(details, function(detail){
                return (_.isEmpty(detail.reference) && _.isEmpty(detail.description) && _.isEmpty(detail.price));
            });
        };
Sandeep M
fonte
1
var data= { 
    myAction: function(array){
        return array.filter(function(el){
           return (el !== (undefined || null || ''));
        }).join(" ");
    }
}; 
var string = data.myAction(["I", "am","", "working", "", "on","", "nodejs", "" ]);
console.log(string);

Resultado:

Estou trabalhando no nodejs

Ele removerá o elemento vazio da matriz e exibirá outro elemento.

Jitendra virani
fonte
output: 'Estou trabalhando no nodejs'. ele removerá o elemento vazio da matriz e exibirá outro elemento.
Jitendra virani
Eu melhorei sua resposta. Por favor, tente fazer uma resposta simples, clara e legível;)
GGO 21/02
1

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:

const arr = [ [], ['not', 'empty'], {}, { key: 'value' }, 0, 1, null, 2, "", "here", " ", 3, undefined, 3, , , , , , 4, , 4, , 5, , 6, , , ]

let filtered = JSON.stringify(
  arr.filter((obj) => {
    return ![null, undefined, ''].includes(obj)
  }).filter((el) => {
    return typeof el != "object" || Object.keys(el).length > 0
  })
)

console.log(JSON.parse(filtered))

Compactação simples (removendo elementos vazios de uma matriz)

Com ES6:

const arr = [0, 1, null, 2, "", 3, undefined, 3, , , , , , 4, , 4, , 5, , 6, , , ,]

let filtered = arr.filter((obj) => { return ![null, undefined].includes(obj) })

console.log(filtered)

Com Javascript simples ->

var arr = [0, 1, null, 2, "", 3, undefined, 3, , , , , , 4, , 4, , 5, , 6, , , ,]

var filtered = arr.filter(function (obj) { return ![null, undefined].includes(obj) })

console.log(filtered)

Zlatko Alomerovic
fonte
0

Filtrando entradas inválidas com uma expressão regular

array = array.filter(/\w/);
filter + regexp
lcabral
fonte
Isto funciona? ele mostra um erro TypeError: [objeto RegExp] não é uma função
FreeLightman
0

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 suporte Array.prototype.filter()nesses navegadores:

if (!Array.prototype.filter) {
  Array.prototype.filter = function(fun/*, thisArg*/) {
    'use strict';
    if (this === void 0 || this === null) {
      throw new TypeError();
    }
    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== 'function') {
      throw new TypeError();
    }
    var res = [];
    var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
    for (var i = 0; i < len; i++) {
      if (i in t) {
        var val = t[i];
        if (fun.call(thisArg, val, i, t)) {
          res.push(val);
        }
      }
    }
    return res;
  };
}
John Slegers
fonte