You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从JS向WebAssembly的Rust传递数组或对象?

从JavaScript向Rust传递字符串数组或对象的正确方式

WebAssembly完全支持接收来自JavaScript的数组或对象,你的问题出在绑定方式不正确,以下是具体解决方案:

1. 直接传递字符串数组

可以使用js_sys::Array接收JavaScript数组,再转换为Rust的Vec<String>:

use wasm_bindgen::prelude::*;
use js_sys::Array;

#[wasm_bindgen]
pub fn array_length(arr: &Array) -> usize {
    let mut string_vec = Vec::new();
    // 遍历JS数组,转换每个元素为字符串
    for item in arr.iter() {
        if let Ok(s) = item.as_string() {
            string_vec.push(s);
        }
    }
    string_vec.len()
}

JavaScript调用示例:

array_length(["hello", "wasm", "rust"]); // 返回3

2. 传递结构化对象(用serde-wasm-bindgen)

如果需要传递包含数组的对象,需要通过serde完成JS值与Rust结构体的反序列化,先确保依赖配置正确:

在Cargo.toml中添加依赖:

[dependencies]
wasm-bindgen = "0.2"
serde = { version = "1.0", features = ["derive"] }
serde-wasm-bindgen = "0.4"
js-sys = "0.3"

然后编写Rust代码:

use wasm_bindgen::prelude::*;
use serde::Deserialize;

// 定义带serde反序列化的结构体
#[derive(Deserialize, Debug)]
pub struct Input {
    array: Vec<String>,
}

#[wasm_bindgen]
pub fn array_length(input: JsValue) -> usize {
    // 将JS值反序列化为Rust结构体
    let input: Input = serde_wasm_bindgen::from_value(input).unwrap();
    input.array.len()
}

JavaScript调用示例:

array_length({ array: ["a", "b", "c", "d"] }); // 返回4

原代码问题说明

你直接给自定义结构体Input加上#[wasm_bindgen]并不能让它自动接收JavaScript对象,wasm-bindgen不会默认完成这种跨语言的结构体映射。必须通过JsValue作为中间载体,再借助serde或者手动转换的方式处理数据。

内容的提问来源于stack exchange,提问作者Pytan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:38:24