La mejor forma de replace la primera aparición de un elemento en una matriz

¿Es esta la mejor manera de replace la primera ocurrencia de algo?

my_list[my_list.indexOf(old_item)] = new_item 

Nota: Si el elemento no está en la matriz, no quiero que pase nada. (Sin errores / matriz rota)

5 Solutions collect form web for “La mejor forma de replace la primera aparición de un elemento en una matriz”

Si no está seguro de que el artículo está en la list, debe hacer lo siguiente:

 var idx = my_list.indexOf(old_item) if (idx !== -1) { my_list[idx] = new_item } 

Pero de lo contrario, creo que es la mejor manera de hacerlo.

Establecer un valor en el índice -1 no generará un error, pero aún así modificará el object como lo haría establecer una key en un object genérico js:

 var my_list = [1, 2, 3]; var old_item = 5; var new_item = 10; my_list[my_list.indexOf(old_item)] = new_item; // my_list is [1, 2, 3, '-1': 10] // my_list.length is still 3 // Object.keys(my_list) is [ '0', '1', '2', '-1' ] 

Entonces probablemente no quieras hacerlo.

¡Realmente no! Hay algunas maneras en que puede hacerlo: una es la forma que tiene, otra está utilizando el método de search lugar de indexOf , que es más versátil ya que puede aceptar arguments de expresión regular. Sin embargo, tenga en count que la search no es compatible con algunos entornos JS antiguos. También hay forms más largas y peores, como usar filter o splice , pero definitivamente no funcionarían mejor.

La única sugerencia que haré es un condicional que verifique si old_item aún está en la list – indexOf devuelve -1 si algo no está en la list, y en ese caso, replaceá un índice inexistente.

Básicamente, creo que estás bien, puede que no sea la expresión más bonita, pero es lo más breve que puedes get en JS.

Las matrices no son estructuras útiles para search valores. Puede considerar un set en su lugar:

 my_set.delete(old_item); my_set.add(new_item); 

Tenga en count que su código puede no comportarse como se espera si old_item no aparece en la matriz, entonces indexOf devolverá -1 . Tal vez use algo como esto:

 var idx = my_list.indexOf(old_item); if (idx >= 0) my_list[idx] = new_item; else my_list.push(new_item); 

indexOf es definitivamente una de las mejores maneras. Pero desea asegurarse de que indexOf haya indexOf éxito antes de usarlo:

 var index = my_list.indexOf(old_item); if (index !== -1) { my_list[index] = new_item; } 

También puedes usar el operador ~ si tienes JavaScript concisa:

 var index = my_list.indexOf(old_item); if (~index) { my_list[index] = new_item; } 

Solución rápida que usa las funciones Array.prototype.indexOf y Array.prototype.splice :

 var myList = [1,2,3,4,5], oldItem = 4, newItem = 7; ~(pos = myList.indexOf(oldItem)) && myList.splice(pos, 1, newItem); console.log(myList); 
Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.