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?

Rolando
fonte
5
Uma combinação de .indexOf()e .splice()deve fazer o truque. Ou talvez, alternativamente .filter(),.
Marc B
1
veja aqui: stackoverflow.com/questions/3954438/…
benedict_w
Possível duplicata de Como remover o item da matriz por valor?
totymedli

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']
Tirannas
fonte
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);
}
Rob W
fonte
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'); 
enesn
fonte
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.

qwertymk
fonte
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);
Matt
fonte
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)

Ali Soltani
fonte
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.

hvgotcodes
fonte
1

usar:

array.splice(2, 1);

Isso remove um item da matriz, iniciando no índice 2 (terceiro item)

Ben Clayton
fonte
1
na verdade, ele remove o segundo item da matriz, o índice começa do zero. essa afirmação tem ambiguidade, pode ser um exemplo mais simples array.splice(2,1)que remove 1 item no índice 2 da matriz. verifique https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/splice para obter mais detalhes
imdzeeshan
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'

siva gopi
fonte
0

use array.splice

/*array.splice(index , howMany[, element1[, ...[, elementN]]])

array.splice(index) // SpiderMonkey/Firefox extension*/

array.splice(1,1)

Fonte: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

chepe263
fonte
A vírgula entre arraye splicedeve ser um ponto.
Rob W
Tentou corrigir, mas a política da SO afirma que as edições devem ter 6 caracteres ou mais: /
ben_nuttall 19/02/14