¿Cómo reemplazar un elemento en una matriz?

Resuelto James asked hace 13 años • 33 respuestas

Cada elemento de esta matriz es un número:

var items = Array(523,3452,334,31, ...5346);

¿Cómo reemplazar algún artículo por uno nuevo?

Por ejemplo, queremos reemplazar 3452con 1010, ¿cómo haríamos esto?

James avatar May 07 '11 01:05 James
Aceptado
var index = items.indexOf(3452);

if (index !== -1) {
    items[index] = 1010;
}

También se recomienda no utilizar el método constructor para inicializar sus matrices. En su lugar, utilice la sintaxis literal:

var items = [523, 3452, 334, 31, 5346];

También puede utilizar el ~operador si le gusta JavaScript conciso y desea acortar la -1comparación:

var index = items.indexOf(3452);

if (~index) {
    items[index] = 1010;
}

A veces incluso me gusta escribir una containsfunción para abstraer esta verificación y hacer que sea más fácil entender lo que está pasando. Lo sorprendente es que esto funciona tanto en matrices como en cadenas:

var contains = function (haystack, needle) {
    return !!~haystack.indexOf(needle);
};

// can be used like so now:
if (contains(items, 3452)) {
    // do something else...
}

A partir de ES6/ES2015 para cadenas y propuesto para ES2016 para matrices, puede determinar más fácilmente si una fuente contiene otro valor:

if (haystack.includes(needle)) {
    // do your thing
}
Eli avatar May 06 '2011 18:05 Eli

El Array.indexOf()método reemplazará la primera instancia. Para obtener cada instancia use Array.map():

a = a.map(item => item == 3452 ? 1010 : item);

Por supuesto, eso crea una nueva matriz. Si desea hacerlo en su lugar, utilice Array.forEach():

a.forEach((item, i) => { if (item == 3452) a[i] = 1010; });
gilly3 avatar May 06 '2011 19:05 gilly3

La respuesta de @gilly3 es genial.

Reemplace el objeto en una matriz, manteniendo el orden de la matriz sin cambios

Prefiero la siguiente forma de actualizar el nuevo registro actualizado en mi conjunto de registros cuando obtengo datos del servidor. Mantiene el orden intacto y es bastante sencillo.

users = users.map(u => u.id !== editedUser.id ? u : editedUser);

var users = [
{id: 1, firstname: 'John', lastname: 'Ken'},
{id: 2, firstname: 'Robin', lastname: 'Hood'},
{id: 3, firstname: 'William', lastname: 'Cook'}
];

var editedUser = {id: 2, firstname: 'Michael', lastname: 'Angelo'};

users = users.map(u => u.id !== editedUser.id ? u : editedUser);

console.log('users -> ', users);
Expandir fragmento

muasif80 avatar Jun 05 '2020 10:06 muasif80

Mi solución sugerida sería:

items.splice(start, deleteCount, item1);

Documentos

La spliceoperación comenzará en el índice start, eliminará deleteCountel elemento de la matriz y lo reemplazará con el nuevo elemento item1.

Shimon Agassi avatar Sep 29 '2018 07:09 Shimon Agassi