Emscripten中如何调用含map<string,vector<string>>参数的C++生成JS代码
如何为对应C++函数的JavaScript代码准备
ms参数 好问题!咱们先拆解一下你给出的C++函数里的map<string, vector<string>>类型——这本质上是一个以字符串为键,字符串数组为值的映射结构,在JavaScript里我们有两种最贴合的方式来实现这个结构,下面分别说明:
方式一:使用普通JavaScript对象
这是最常用也最直观的方式,JS对象的键天然就是字符串(或者会被转为字符串),值可以直接用数组来对应C++里的vector<string>。
准备参数示例
// 完全对应C++中map<string, vector<string>>的结构 const ms = { "fruits": ["apple", "banana", "orange"], "animals": ["cat", "dog"], "books": ["The Hobbit"] };
对应的JavaScript版printmap函数(模拟C++逻辑)
function printmap(ms) { // 遍历对象的每一个键 for (const key in ms) { // 确保只遍历对象自身的属性(避免原型链上的额外属性) if (ms.hasOwnProperty(key)) { console.log(`${key}:`); // 遍历对应数组里的每一个元素 ms[key].forEach(item => { console.log(`\t${item}`); }); } } } // 调用函数 printmap(ms);
方式二:使用ES6 Map对象
如果你需要更贴近C++map的有序特性(C的map是有序的,而普通JS对象在ES6之前不保证键的顺序),可以用ES6引入的Map对象,它的键值对结构和Cmap几乎一致。
准备参数示例
// 用ES6 Map构造映射 const ms = new Map([ ["fruits", ["apple", "banana", "orange"]], ["animals", ["cat", "dog"]], ["books", ["The Hobbit"]] ]);
对应的JavaScript版printmap函数
function printmap(ms) { // 遍历Map的每一组键值对 for (const [key, values] of ms) { console.log(`${key}:`); values.forEach(item => { console.log(`\t${item}`); }); } } // 调用函数 printmap(ms);
额外说明
如果你的JavaScript代码是通过**C转JS的工具(比如Emscripten)**生成的,那需要注意工具对C容器的转换规则——通常这类工具会把map和vector包装成特定的JS对象,你需要按照工具的文档来构造对应的参数。但如果是自己手动实现C++函数的JS版本,上面两种方式都可以完美适配。
内容的提问来源于stack exchange,提问作者Waslap
相关产品推荐
相关产品推荐

