Esto puede parecer una pregunta muy nueva para los novatos, pero estoy luchando con esto a partir de ahora y busco ayuda.

Aquí hay un ejemplo de matriz en JavaScript

var SelectedFilters =  ["[size:12:12]","[size:12:12]","[size:13:13]","[size:14:14]", "[color:14:14]","[color:14:14]","[type:14:14]","[type:14:14]"];

Ahora deseo eliminar ciertos elementos de esta matriz en función de un término de búsqueda, ahora el término de búsqueda contiene solo una parte de la cadena, como

var searchTerm1 = 'size' 
var searchTerm2 = 'color'

Ya probé el siguiente código, pero no funciona:

var i = SelectedFilters.indexOf(searchTerm1);
    if (i != -1) 
     {
     SelectedFilters.splice(i, 1);
     }

También he intentado ejecutar el bucle for, para iterar en todos los elementos, pero nuevamente la búsqueda falló porque no puede coincidir con 'tamaño' O 'color'

Lo que estoy buscando: si se usa searchterm1, el resultado resultante será como:

["[color:14:14]","[color:14:14]","[type:14:14]","[type:14:14]"];

Y en caso de que se use searchterm2, la salida resultante debe ser:

["[size:12:12]","[size:12:12]","[size:13:13]","[size:14:14]","[type:14:14]","[type:14:14]"];

Sería genial si alguien puede resolver este rompecabezas, mientras tanto, también estoy tratando de encontrar una solución.

2
Akai Tanaka 11 may. 2016 a las 15:22

3 respuestas

La mejor respuesta

Su intento no funcionó porque .indexOf() en una matriz busca una coincidencia exacta.

Dado que de acuerdo con su pregunta y comentario, debe mutar la matriz original, debe recorrer la matriz y probar cada cadena individualmente y luego llamar a .splice() cada vez que encuentre una que deba eliminarse.

var SelectedFilters =  ["[size:12:12]","[size:12:12]","[size:13:13]","[size:14:14]", "[color:14:14]","[color:14:14]","[type:14:14]","[type:14:14]"];

var searchTerm1 = 'size' 
var searchTerm2 = 'color'

for (var i = SelectedFilters.length-1; i > -1; i--) {
  if (SelectedFilters[i].startsWith(searchTerm1, 1)) {
    SelectedFilters.splice(i, 1)
  }
}

document.querySelector("pre").textContent = 
  JSON.stringify(SelectedFilters, null, 2)
<pre></pre>

El bucle utilizado anteriormente va en reversa. Esto es importante ya que cada vez que hacemos un .splice(), la matriz se vuelve a indexar, por lo que si avanzamos, terminaríamos saltando los elementos adyacentes que se eliminarán.

El .startsWith() comprueba si la cadena comienza con el término de búsqueda dado. Le pasé al segundo parámetro un valor de 1 para que comience a buscar en el segundo carácter.

1
3 revsuser1106925 11 may. 2016 a las 12:42

Puedes hacerlo con Array#filter,

var searchTerm1 = 'size';
var result = SelectedFilters.filter(v => !v.includes(searchTerm1));

console.log(result); //["[color:14:14]","[color:14:14]","[type:14:14]","[type:14:14]"];

Si quieres alterar la matriz original, hazlo,

var SelectedFilters = ["[size:12:12]", "[size:12:12]", "[size:13:13]", "[size:14:14]", "[color:14:14]", "[color:14:14]", "[type:14:14]", "[type:14:14]"];

var searchTerm1 = 'size',cnt = 0, len = SelectedFilters.length - 1;
while (cnt <= len) {
  if (SelectedFilters[len - cnt].includes(searchTerm1)) SelectedFilters.splice(len - cnt, 1);
  cnt++;
}

console.log(SelectedFilters);

Demo

0
Rajaprabhu Aravindasamy 11 may. 2016 a las 12:37

Puede usar el método de matriz filter

var searchTerm = "size";
SelectedFilters  = SelectedFilters.filter(function(val){
  return val.indexOf( searchTerm ) == -1;
}); 
0
gurvinder372 11 may. 2016 a las 12:23