Pesquisa de matriz Javascript e remover string?


132

Eu tenho:

var array = new Array();
array.push("A");
array.push("B");
array.push("C");

Eu quero ser capaz de fazer algo como:

array.remove("B");

mas não há função de remoção. Como eu faço isso?


5
Uma combinação de .indexOf()e .splice()deve fazer o truque. Ou talvez, alternativamente .filter(),.
Marc B


Respostas:


185

Na verdade, estou atualizando esse segmento com uma solução de 1 linha mais recente:

let arr = ['A', 'B', 'C'];
arr = arr.filter(e => e !== 'B'); // will return ['A', 'C']

A idéia é basicamente filtrar a matriz, selecionando todos os elementos diferentes do elemento que você deseja remover.

Nota: removerá todas as ocorrências.

EDITAR:

Se você deseja remover apenas a primeira ocorrência:

t = ['A', 'B', 'C', 'B'];
t.splice(t.indexOf('B'), 1); // will return ['B'] and t is now equal to ['A', 'C', 'B']

1
Esta solução retorna uma cópia da matriz, enquanto o uso de emenda remove o (s) elemento (s) no lugar. Qual você escolher depende do contexto.
Twhitehead

6
Isso é perfeito para coisas do Redux, nas quais você precisa retornar um novo estado.
Colinwong

@ Regis realmente não, arr.filter retorna uma nova matriz. Portanto, o arr.filter (e => e! == 'B') não modifica o arr. Ou talvez eu não tenha entendido seu comentário corretamente?
Tyrannas

existe um método para fazer isso, mas para parar na primeira ocorrência? então se existem 5 'B's para remover apenas um?
Ari #

1
@Ari Eu atualizei a resposta para a remoção de apenas um elemento
Tyrannas

171

Percorra a lista na ordem inversa e use o .splicemétodo

var array = ['A', 'B', 'C']; // Test
var search_term = 'B';

for (var i=array.length-1; i>=0; i--) {
    if (array[i] === search_term) {
        array.splice(i, 1);
        // break;       //<-- Uncomment  if only the first term has to be removed
    }
}

A ordem inversa é importante quando todas as ocorrências do termo de pesquisa precisam ser removidas. Caso contrário, o contador aumentará e você pulará elementos.

Quando apenas a primeira ocorrência tiver que ser removida, o seguinte também funcionará:

var index = array.indexOf(search_term);    // <-- Not supported in <IE9
if (index !== -1) {
    array.splice(index, 1);
}

1
Eu estou supondo, porque é para ser um pouco mais rápido para iterar ao contrário.
Ben Clayton

1
@ BenClayton: Obrigado. FWIW, em JavaScript, isso não é verdade. A contagem decrescente para 0não é automaticamente mais rápida como é, digamos, C. Contanto que você armazene em cache o limite, é claro, o que complicaria as coisas se você continuar após a primeira partida (mas não se parar).
TJ Crowder

Se estamos buscando velocidade, por que não usar enquanto -? : D
Snuffleupagus

11
Não se trata de velocidade, ele até diz isso em sua resposta. É sobre os elementos SKIPPING. Se você estiver na posição 5 e emendar essa posição, o elemento do formulário localizado na posição 6 estará agora em 5 . Ainda assim, seu contador de loop aumenta, a próxima iteração é a posição 6 e é aí que você pulou um item. É por isso que está na ordem inversa.
Amenthes

1
Se você remover itens em um loop de avanço e um item for removido, a última iteração poderá
gerar

24

Lista de um forros

Vamos resolver este problema para esta matriz:

var array = ['A', 'B', 'C'];

1. Remova apenas o primeiro: Use Se você tiver certeza de que o item existe

array.splice(array.indexOf('B'), 1);

2. Remova apenas o último: Use Se você tiver certeza de que o item existe

array.splice(array.lastIndexOf('B'), 1);

3. Remova todas as ocorrências:

array = array.filter(v => v !== 'B'); 

21

DEMO

Você precisa encontrar o local do que está procurando .indexOf()e removê-lo com.splice()

function remove(arr, what) {
    var found = arr.indexOf(what);

    while (found !== -1) {
        arr.splice(found, 1);
        found = arr.indexOf(what);
    }
}

var array = new Array();
array.push("A");
array.push("B");
array.push("C");
    
remove(array, 'B');
alert(array)​​​​;

Isso cuidará de todas as ocorrências.


Para navegadores que não suportam, .indexOf()você pode adicioná- lo ao seu arquivo javascript.
Qwertymk 20/03/12

sim, elegante. Se você precisar de uma opção para remover apenas alguns elementos, por exemplo, apenas o primeiro: a mesma atualização: jsfiddle.net/qpZFd/9
sebilasse

Eu sempre obter o seguinte erro: Uncaught ReferenceError: array is not defined. O que está errado?
Pathros

Se você estiver seguindo esse caminho, poderá facilmente aproveitar .indexOf()um pouco mais. Se você passar foundcomo o segundo argumento para a .indexOf()chamada dentro do laço while , os elementos na matriz que já foram verificados e acabou não sendo iguais não são verificados novamente: found = arr.indexOf(what, found);
pimmhogeling

14

Simplesmente

array.splice(array.indexOf(item), 1);

Sim, exceto que indexOf retornará -1se nada for encontrado e oops, splice excluirá 1 elemento do final da matriz
Ricky Spanish

2

Solução simples (ES6)

Se você não possui elemento duplicado

Array.prototype.remove = function(elem) {
  var indexElement = this.findIndex(el => el === elem);
  if (indexElement != -1)
    this.splice(indexElement, 1);
  return this;
};   

Demonstração on-line (violino)


Essa solução sempre remove o último elemento se nenhuma correspondência for encontrada.
Markus s

1

Você tem que escrever o seu próprio remover. Você pode percorrer a matriz, pegar o índice do item que deseja remover e usá splice-lo para removê-lo.

Como alternativa, você pode criar uma nova matriz, fazer um loop sobre a matriz atual e, se o objeto atual não corresponder ao que você deseja remover, coloque-o em uma nova matriz.



1
const changedArray = array.filter( function(value) {
  return value !== 'B'
});

ou você pode usar:

const changedArray = array.filter( (value) => value === 'B');

O changesArray conterá o valor sem 'B'


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.