Búsqueda de matriz de Javascript y eliminar cadena?

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']
Tyrannas
fuente
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);
}
Rob W
fuente
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'); 
Enesn
fuente
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.

qwertymk
fuente
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);
Mate
fuente
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)

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

hvgotcodes
fuente
1

utilizar:

array.splice(2, 1);

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

Ben Clayton
fuente
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'

siva gopi
fuente