Búsqueda de matriz de Javascript y eliminar cadena?


134

Yo tengo:

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

Quiero poder hacer algo como:

array.remove("B");

pero no hay función de eliminación. ¿Cómo logro esto?


55
Una combinación de .indexOf()y .splice()debería hacer el truco. O tal vez, en su defecto, .filter().
Marc B


Respuestas:


186

De hecho, estoy actualizando este hilo con una solución de 1 línea más reciente:

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

La idea es básicamente filtrar la matriz seleccionando todos los elementos diferentes al elemento que desea eliminar.

Nota: eliminará todas las ocurrencias.

EDITAR:

Si desea eliminar solo la primera ocurrencia:

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 solución devuelve una copia de la matriz, mientras que el uso de empalme elimina los elementos en su lugar. El que elijas depende del contexto.
twhitehead

66
Esto es perfecto para las cosas de Redux en las que necesita devolver un nuevo estado.
Colinwong

@Regis en realidad no, arr.filter devuelve una nueva matriz. Entonces arr.filter (e => e! == 'B') no modificará arr. ¿O tal vez no entendí tu comentario correctamente?
Tyrannas

¿Hay algún método para hacer esto pero para detenerse en el primer caso? Entonces, ¿si hay 5 'B para eliminar uno?
Ari

1
@Ari He actualizado la respuesta para eliminar solo un elemento
Tyrannas

171

Recorra la lista en orden inverso y use el .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
    }
}

El orden inverso es importante cuando se deben eliminar todas las apariciones del término de búsqueda. De lo contrario, el contador aumentará y omitirá elementos.

Cuando solo se debe eliminar la primera aparición, lo siguiente también funcionará:

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

1
Supongo que está destinado a ser un poco más rápido para iterar en reversa.
Ben Clayton

1
@BenClayton: Gracias. FWIW, en JavaScript, eso no es confiablemente cierto. La cuenta regresiva para 0no es automáticamente más rápida como lo es, digamos, C. Siempre que guarde el límite en caché, por supuesto, lo que complicaría las cosas si continúa después del primer partido (pero no si se detiene).
TJ Crowder

Si buscamos velocidad, ¿por qué no usar while -? : D
Snuffleupagus

11
No se trata de velocidad, incluso lo dice en su respuesta. Se trata de SALTAR elementos. Si está en la posición 5 y empalma esa posición, el elemento que se encuentra en la posición 6 ahora está en 5 . Aún así, su contador de bucles aumenta, la siguiente iteración es la posición 6 y ahí es donde omitió un elemento. Por eso está en orden inverso.
Amenthes

1
Si elimina elementos en un bucle hacia adelante, y un elemento se elimina, la última iteración puede arrojar excepciones de puntero nulo, ya que hará referencia a un índice que no existe
Drenai

24

Lista de One Liners

Resolvamos este problema para esta matriz:

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

1. Elimine solo el primero: Use Si está seguro de que el artículo existe

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

2. Elimine solo el último: Use Si está seguro de que el artículo existe

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

3. Eliminar todas las ocurrencias:

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

21

MANIFESTACIÓN

Necesita encontrar la ubicación de lo que está buscando y .indexOf()luego eliminarlo con.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)​​​​;

Esto se encargará de todos los sucesos.


Para los navegadores que no son compatibles .indexOf(), puede agregar esto a su archivo javascript.
qwertymk

Sí, elegante. Si necesita una opción para eliminar solo algunos elementos, por ejemplo, solo el primero: el mismo actualizado: jsfiddle.net/qpZFd/9
sebilasse

Siempre sale el siguiente error: Uncaught ReferenceError: array is not defined. ¿Qué está mal?
Pathros

Si va por esta ruta, puede aprovechar fácilmente .indexOf()un poco más. Si pasa foundcomo segundo argumento a la .indexOf()llamada dentro del ciclo while , los elementos en la matriz que ya se verificaron y terminaron no siendo iguales no se verifican nuevamente: found = arr.indexOf(what, found);
pimmhogeling

14

Simplemente

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

sí, excepto que indexOf regresará -1si no se encuentra nada y, ¡ay !, el empalme eliminará 1 elemento del final de la matriz
Ricky Spanish

2

Solución simple (ES6)

Si no tienes un elemento duplicado

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

Demostración en línea (violín)


Esta solución siempre elimina el último elemento si NO se encuentra ninguna coincidencia.
Markus s

1

Tienes que escribir tu propio eliminar. Puede recorrer la matriz, tomar el índice del elemento que desea eliminar y usarsplice para eliminarlo.

Alternativamente, puede crear una nueva matriz, recorrer la matriz actual y, si el objeto actual no coincide con lo que desea eliminar, colóquela en una nueva matriz.


1

utilizar:

array.splice(2, 1);

Esto elimina un elemento de la matriz, comenzando en el índice 2 (tercer elemento)


1
en realidad eliminará el segundo elemento de la matriz, el índice comienza desde cero. esta afirmación tiene ambigüedad, podría ser un ejemplo más simple array.splice(2,1)que elimina 1 elemento en el índice 2 de la matriz. consulte https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice para obtener más detalles
imdzeeshan

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

o puedes usar:

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

El Array modificado contendrá el valor sin valor 'B'


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.