Beh, tecnicamente questo non sarebbe in sostituzione di in quanto non c'è un articolo nell'indice che si sta modificando.
Guarda come viene gestito in Clojure, un linguaggio costruito attorno a implementazioni canoniche per strutture di dati immutabili.
(assoc [1] 2 3)
;; IndexOutOfBoundsException
Non solo non riesce, ma si blocca anche. Queste strutture dati sono progettate per essere il più robuste possibile e quando si incontrano questi tipi di errori, generalmente non è perché hai scoperto un caso limite, ma più probabilmente stai usando la struttura dati sbagliata.
Se si finisce con gli array sparsi, prendere in considerazione la modellazione con oggetti o mappe.
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}
Tuttavia, Map è una struttura dati fondamentalmente mutevole, così avresti bisogno di scambiare questo per una variante immutabile, con una libreria come 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}
Naturalmente, ci potrebbe essere un buon motivo per voler usare gli array di JavaScript, quindi ecco una soluzione per buona misura.
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
];
}
}
Se si desidera qualcosa ** ** veloce https://stackoverflow.com/a/47943825/1480391,;) –