Dalam JavaScript biasa:
fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.splice(2, 0, "Lemon", "Kiwi");
fruits // == ["Banana", "Orange", "Lemon", "Kiwi", "Apple", "Mango"]
Tetapi tanda tangan hanya dalam AS:
function splice(start: i32, deleteCount?: i32): Array<T>
Adakah cara lain untuk menyambungkan data ke dalam array yang ada?
Saat ini AS tidak dapat melakukan fungsi variadic. Jadi saya mengusulkan solusi ini untuk memasukkan item baru:
export function insertAfter<T>(arr: T[], index: i32, value: T): T[] {
const len = arr.length + 1
const res = new Array<T>(len)
if (index < 0) index = len + index - 1
if (index > len) index = len - 1
let i = 0
while (i < index) res[i] = arr[i++] // or use memory.copy
res[i++] = value
while (i < len) res[i] = arr[i++ - 1] // or use memory.copy
return res
}
// intead fruits.splice(2, 0, "Lemon", "Kiwi") use:
fruits = insertAfter(fruits, 2, "Lemon");
fruits = insertAfter(fruits, 3, "Kiwi");
@MaxGraey Apakah menurut Anda kami dapat menyediakan ini untuk sementara di stdlib? Seperti spliceAndInsert
mengambil array alih-alih params lainnya?
Saya tidak berpikir array item insert adalah solusi yang tepat. Bagaimanapun kami memiliki banyak tempat lain di mana membutuhkan fungsi variadic jadi lebih baik tambahkan mekanisme yang tepat untuk ini diimplementasikan dalam kompiler.
Terima kasih banyak @MaxGraey
insertAfter
bekerja sedikit berbeda dari yang diiklankan, ini bukan penggantian array di tempat, tetapi mengalokasikan array baru setiap kali (misalnya tidak menggunakan realloc
internal), sehingga perlu penugasan ulang:
import {insertAfter} from "./insertAfter";
export function example(): string[] {
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits = insertAfter(fruits, 2, "Lemon");
fruits = insertAfter(fruits, 3, "Kiwi");
return fruits;
}
Dan di browser (dengan skrip Loader yang dimodifikasi yang mengekspor getArray
dan getString
):
fruits_ptr = assemblyscript.module.exports.example()
// 21359280
fruits = Loader.getArray(fruits_ptr)
// (6) [1152, 1184, 1312, 1616, 1216, 1248]
fruits.map(Loader.getString)
// (6) ["Banana", "Orange", "Lemon", "Kiwi", "Apple", "Mango"]
Ya, contoh tetap. Btw Anda bisa memperbaikinya menggunakan __realloc
dan memory.copy