好吧,从技术上讲,这不会替换,因为您要更改的索引处没有项目。
看看它是如何在 Clojure 中处理的——一种围绕不可变数据结构的规范实现而构建的语言。
(assoc [1] 2 3)
;; IndexOutOfBoundsException
它不仅会失败,还会崩溃。这些数据结构被设计为尽可能健壮,当您遇到此类错误时,通常不是因为您发现了边缘情况,而更有可能是您使用了错误的数据结构。
如果您最终得到的是稀疏数组,那么请考虑使用对象或地图对其进行建模。
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}
但是,Map 本质上是一种可变的数据结构,因此您需要将其替换为具有 Immutable.js 或 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}
当然,想要使用 JavaScript 的数组可能有一个很好的理由,所以这里有一个很好的解决方案。
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
];
}
}