Vâng, về mặt kỹ thuật, điều này sẽ không được thay thế vì không có mục nào trong chỉ mục bạn đang thay đổi.
Xem cách nó được xử lý trong Clojure — một ngôn ngữ được xây dựng xung quanh việc triển khai chính tắc cho cấu trúc dữ liệu không thay đổi.
(assoc [1] 2 3)
;; IndexOutOfBoundsException
Nó không chỉ thất bại mà còn bị lỗi. Các cấu trúc dữ liệu này được thiết kế mạnh mẽ nhất có thể và khi bạn gặp phải các loại lỗi này, thường không phải vì bạn đã phát hiện ra một trường hợp cạnh, nhưng nhiều khả năng bạn đang sử dụng cấu trúc dữ liệu sai.
Nếu bạn kết thúc bằng mảng thưa thớt, hãy xem xét mô hình hóa chúng bằng các đối tượng hoặc bản đồ để thay thế.
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}
Tuy nhiên, Bản đồ là một cấu trúc dữ liệu cơ bản có thể thay đổi, vì vậy bạn sẽ cần phải trao đổi này ra cho một biến thể bất biến với một thư viện như Immutable.js hoặc 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}
Tất nhiên, có thể có lý do chính đáng để sử dụng mảng JavaScript, vì vậy đây là giải pháp để đo lường tốt.
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
];
}
}
Nếu bạn muốn một cái gì đó ** nhanh ** https://stackoverflow.com/a/47943825/1480391,;) –