javascript - eliminar - Reemplazar el elemento en una posición específica en una matriz sin mutarlo
matriz javascript (6)
La manera rapida
function replaceAt(array, index, value) {
const ret = array.slice(0);
ret[index] = value;
return ret;
}
Ver el JSPerf (gracias a )
Artículos Relacionados:
- Javascript es la forma más rápida de duplicar un Array - slice vs for loop
- https://github.com/lodash/lodash/issues/2053#issuecomment-188776090
¿Cómo se puede realizar la siguiente operación sin mutar la matriz?
let array = [''item1''];
console.log(array); // [''item1'']
array[2] = ''item2''; // array is mutated
console.log(array); // [''item1'', undefined, ''item2'']
En el código anterior, la variable de array
está mutada. ¿Cómo puedo realizar la misma operación sin mutar la matriz?
Así es como me gustaría hacerlo:
function update(array, newItem, atIndex) {
return array.map((item, index) => index === atIndex ? newItem : item);
}
En general, la operación de distribución de arreglos produce pocos arreglos temporales para usted, pero el map
no lo hace, por lo que puede ser más rápido. También puedes ver esta discusión como referencia.
Bueno, técnicamente esto no se reemplazaría ya que no hay un elemento en el índice que estás cambiando.
Mire cómo se maneja en Clojure, un lenguaje que se basa en implementaciones canónicas para estructuras de datos inmutables.
(assoc [1] 2 3)
;; IndexOutOfBoundsException
No solo falla, sino que también se bloquea. Estas estructuras de datos están diseñadas para ser tan sólidas como sea posible y, cuando se encuentra con este tipo de errores, generalmente no es porque haya descubierto un caso límite, sino que es más probable que esté utilizando la estructura de datos incorrecta.
Si está terminando con matrices dispersas, entonces considere modelarlas con objetos o mapas.
let items = { 0: 1 };
{ ...items, 2: 3 };
// => { 0: 1, 2: 3 }
let items = new Map([ [0, 1] ]);
items(2, 3);
// => Map {0 => 1, 2 => 3}
Sin embargo, Map es una estructura de datos fundamentalmente mutable, por lo que necesitarías intercambiar esto por una variante inmutable con una biblioteca como Immutable.js o Mori .
let items = Immutable.Map([ [0, 2] ]);
items.set(2, 3);
// => Immutable.Map {0 => 1, 2 => 3}
let items = mori.hashMap();
mori.assoc(items, 2, 3);
// => mori.hashMap {0 => 1, 2 => 3}
Por supuesto, puede haber una buena razón para querer usar los arreglos de JavaScript, así que aquí hay una solución para una buena medida.
function set(arr, index, val) {
if(index < arr.length) {
return [
...arr.slice(0, position),
val,
...arr.slice(position + 1)
];
} else {
return [
...arr,
...Array(index - arr.length),
val
];
}
}
Puedes usar Object.assign
:
Object.assign([], array, {2: newItem});
Simplemente puede configurar una nueva matriz como tal:
const newItemArray = array.slice();
Y luego establezca el valor para el índice para el que desea tener un valor.
newItemArray[position] = newItem
y devolver eso. Los valores debajo de los índices intermedios tendrán undefined
.
O la alternativa obviamente sería:
Object.assign([], array, {<position_here>: newItem});
var list1 = [''a'',''b'',''c''];
var list2 = list1.slice();
list2.splice(2, 0, "beta", "gamma");
console.log(list1);
console.log(list2);
¿Es esto lo que quieres?