2011-08-10 13 views
8

He leído esta pregunta:Eliminación de un elemento de una matriz que especifica un valor en Javascript

Deleting array elements in JavaScript - delete vs splice

Y parece que tanto el empalme y eliminar requieren un índice del elemento con el fin de eliminar, así que ¿cómo ¿puedo encontrar fácilmente el índice cuando tengo el valor?

Por ejemplo si tengo una matriz que tiene este aspecto:

["test1", "test2", "test3"] 

y quiero eliminar test2. El proceso que estoy usando ahora, que espero no sea la forma correcta de hacerlo, es usar $.each comprobando el valor de cada elemento en la matriz, manteniendo un contador a través del proceso (utilizado como referencia del índice) y si el valor es igual a "test2", entonces tengo mi índice (en forma de contador) y luego uso el empalme para eliminarlo.

Mientras que la matriz crece, me imagino que este sería un proceso lento, pero ¿qué alternativas tengo?

+1

Mira 'indexOf' para lo que quieras. –

+0

¿Se pueden ordenar sus elementos? – VirtualTroll

Respuesta

4

Usted desea utilizar la función splice() para retirar el artículo, indexOf lo encontrará en la matriz:

para encontrar un elemento específico de la matriz: (saber para eliminar)

var index = array.indexOf('test2'); 

Ejemplo completo:

var array = ['test1', 'test2', 'test3']; 
var value_to_remove = 'test2'; 
array.splice(array.indexOf(value_to_remove), 1); 

Working Demo

+0

Él lo sabe, incluso dice que lo está usando en cuestión. Lo que QUIERE saber es cómo encontrar el índice a usar en 'empalme'. –

+0

Gracias josh.trow y Rionmonster! –

+0

Espero que haya resuelto tu problema Pete :) –

0

underscore.js es una pequeña biblioteca realmente impresionante con un montón de buenas funciones de utilidad. En este caso, #reject sería apropiado.

http://documentcloud.github.com/underscore/#reject

(Aunque el método interno es, por supuesto, similar a su lookup índice manual y rebanada/empalme).

3
var array = ["test1", "test2", "test3"]; 
array.splice(array.indexOf("test2"), 1); 

indexOf (source):
Devuelve el primer índice en el cual un elemento dado se puede encontrar en la matriz, o -1 si no está presente.

1

Encontrará un elemento por valor usando Array#indexOf, y luego usará el índice resultante. Tenga en cuenta que los navegadores más antiguos pueden no tenerlo, por lo que querrá verificar si está allí y, si no, agregarlo   — here's some code de MDC que hace la comprobación y agrega la función si no está allí.

if (!Array.prototype.indexOf) { 
    Array.prototype.indexOf = function (searchElement /*, fromIndex */) { 
     "use strict"; 
     if (this === void 0 || this === null) { 
      throw new TypeError(); 
     } 
     var t = Object(this); 
     var len = t.length >>> 0; 
     if (len === 0) { 
      return -1; 
     } 
     var n = 0; 
     if (arguments.length > 0) { 
      n = Number(arguments[1]); 
      if (n !== n) { // shortcut for verifying if it's NaN 
       n = 0; 
      } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) { 
       n = (n > 0 || -1) * Math.floor(Math.abs(n)); 
      } 
     } 
     if (n >= len) { 
      return -1; 
     } 
     var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); 
     for (; k < len; k++) { 
      if (k in t && t[k] === searchElement) { 
       return k; 
      } 
     } 
     return -1; 
    } 
} 

Tenga en cuenta que si se añade cosas a la Array prototipo de esa manera, for..in bucles que asumen que sólo va a ver los índices de matriz (es decir, incorrect pero for..in lazos comunes) empezará a tener problemas porque verán la cadena "indexOf" cuando solo esperan ver índices de matriz, vea this blog post para más detalles.

2

Puede jQuery de $.inArray y deshacerse de su bucle $.each, y funciona a través del navegador (a diferencia de Array.indexOf):

var index = $.inArray("test2", ["test1", "test2", "test3"]); // 1 

(Soy consciente de que su pregunta no está etiquetado con 'jQuery', pero menciona que ya está utilizando un bucle $.each).

+0

¡Esto es genial, gracias! –

Cuestiones relacionadas