Remover strings vazias da matriz enquanto mantém o registro Sem Loop?

90

Esta pergunta foi feita aqui: Remova as strings vazias da matriz enquanto mantém o registro dos índices com strings não vazias

Se você notar o dado como @Baz disposto;

"I", "am", "", "still", "here", "", "man"

"e, a partir disso, desejo produzir as duas seguintes matrizes:"

"I", "am", "still", "here", "man"

Todas as respostas a esta pergunta referem-se a uma forma de looping.

Minha pergunta: Existe a possibilidade de remover todos os indexES empty string sem nenhum loop? ... existe alguma outra alternativa além de iterar a matriz?

Podem ser alguns regexou alguns dos jQueryquais não temos conhecimento?

Todas as respostas ou sugestões são muito apreciadas.

Universal Grasp
fonte

Respostas:

323
var arr = ["I", "am", "", "still", "here", "", "man"]
// arr = ["I", "am", "", "still", "here", "", "man"]
arr = arr.filter(Boolean)
// arr = ["I", "am", "still", "here", "man"]

filter documentação


// arr = ["I", "am", "", "still", "here", "", "man"]
arr = arr.filter(v=>v!='');
// arr = ["I", "am", "still", "here", "man"]

Documentação das funções de seta

Isaac
fonte
3
Eu sei exatamente como você se sente, usei-o meses atrás, corrige tantos pequenos problemas
Isaac
14
@DiegoPlentz As pessoas que ainda estão executando o IE8 terão muito mais problemas do que apenas remover espaços em branco em um array ... Quase nunca considero oferecer suporte a esse navegador hoje em dia
Isaac
Este é o mais próximo array.filter(!!)que podemos obter atualmente :)
james_womack
2
Todo o crédito por esta resposta deve ir para stackoverflow.com/questions/16701319/…
Isaac
Alguma explicação a respeito Booleanseria bom.
roubo de
18
var newArray = oldArray.filter(function(v){return v!==''});
Haithamahmed
fonte
Facilmente a melhor resposta. Faz exatamente o que a pergunta pede. Não remove valores zero.
Bryan
9

ATENÇÃO: A documentação diz:

filteré uma extensão JavaScript do padrão ECMA-262; como tal , pode não estar presente em outras implementações do padrão . Você pode contornar isso inserindo o código a seguir no início de seus scripts, permitindo o uso de filtro em implementações ECMA-262 que não o suportam nativamente. Esse algoritmo é exatamente aquele especificado em ECMA-262, 5ª edição, assumindo que fn.call avalia o valor original de Function.prototype.call e que Array.prototype.push tem seu valor original.

Portanto, para evitar alguma dor de cabeça, pode ser necessário adicionar este código ao seu script no início .

if (!Array.prototype.filter) {
  Array.prototype.filter = function (fn, context) {
    var i,
        value,
        result = [],
        length;
        if (!this || typeof fn !== 'function' || (fn instanceof RegExp)) {
          throw new TypeError();
        }
        length = this.length;
        for (i = 0; i < length; i++) {
          if (this.hasOwnProperty(i)) {
            value = this[i];
            if (fn.call(context, value, i, this)) {
              result.push(value);
            }
          }
        }
    return result;
  };
}
ErickBest
fonte
3
arr = arr.filter(v => v);

como retornado vé implicidade convertida em verdade

haind
fonte
2

Se estiver usando jQuery, grep pode ser útil:


var arr = [ a, b, c, , e, f, , g, h ];

arr = jQuery.grep(arr, function(n){ return (n); });

arr é agora [ a, b, c, d, e, f, g];

sansid1983
fonte
2
jquery parece muito pesado para uma tarefa servil
Isaac
0

ou seja, precisamos ter vários endereços de e-mail separados por vírgula, espaços ou nova linha como abaixo.

    var emails = EmailText.replace(","," ").replace("\n"," ").replace(" ","").split(" ");
    for(var i in emails)
        emails[i] = emails[i].replace(/(\r\n|\n|\r)/gm,"");

    emails.filter(Boolean);
    console.log(emails);
Atif Hussain
fonte
.replace(" ","").split(" ")"substitua todos os espaços por nada, depois tente dividir em cada espaço"
Isaac