objetos matriz eliminar elementos elemento ejemplos change buscar array agregar javascript arrays ecmascript-6 immutability

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:

¿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?