如何迭代 Cheerp/js 中的动态命名对象?
How to iterate over dynamically named objects in Cheerp/js?
Cheerp 是一个 C++ 到 js/wasm 的转译器。
使用 C++,我可以通过静态定义对象(及其成员)的类型和名称来与 extern
Javascript 对象交互。
以下对象为例:
var example1 = {
"itemA" : {
value : 3
},
"itemB" : {
value : 1
},
"item3165942" : {
value : 4
}
}
将 example1
静态定义为结构,将 itemA/itemB 定义为子结构是微不足道的。但我永远无法访问 example1["item3165942"]
.
如何从 C++ 中动态检索、索引和迭代 javascript 对象的 keys/values?假设 example1
中的所有项目都是以下类型:
struct item_type {
int32_t value;
};
如果您需要处理具有未知结构的属性(=您在编译时不知道 JavaScript 结构的结构),您最好遍历其条目:
#include <cheerp/types.h>
#include <cheerp/client.h>
namespace client
{
struct CustomItem : public Object
{
int get_value();
};
}
void enumerateProperties(client::Object* obj)
{
auto entries = client::Object::keys(obj);
for (int i = 0; i<entries->get_length(); i++)
{
client::String* K = (client::String*)(*entries)[i];
client::CustomItem* CI = (client::CustomItem*)((*obj)[*K]);
client::console.log(*K, CI->get_value());
}
}
请注意,必须明确进行两个转换:指定条目为 client::String*,并且映射项的类型为 (client::CustomItem*)。
您还应该在名称空间客户端内声明 CustomItem 有一个方法 get_value() (将被编译为 属性 上的 javascript getter 命名为 "value" ).
您也可以使用相同的模式通过 ["itemA"]
访问属性,这样:
client::CustomItem * CI = (client::CustomItem*)((*obj)["itemA"]);
Cheerp 是一个 C++ 到 js/wasm 的转译器。
使用 C++,我可以通过静态定义对象(及其成员)的类型和名称来与 extern
Javascript 对象交互。
以下对象为例:
var example1 = {
"itemA" : {
value : 3
},
"itemB" : {
value : 1
},
"item3165942" : {
value : 4
}
}
将 example1
静态定义为结构,将 itemA/itemB 定义为子结构是微不足道的。但我永远无法访问 example1["item3165942"]
.
如何从 C++ 中动态检索、索引和迭代 javascript 对象的 keys/values?假设 example1
中的所有项目都是以下类型:
struct item_type {
int32_t value;
};
如果您需要处理具有未知结构的属性(=您在编译时不知道 JavaScript 结构的结构),您最好遍历其条目:
#include <cheerp/types.h>
#include <cheerp/client.h>
namespace client
{
struct CustomItem : public Object
{
int get_value();
};
}
void enumerateProperties(client::Object* obj)
{
auto entries = client::Object::keys(obj);
for (int i = 0; i<entries->get_length(); i++)
{
client::String* K = (client::String*)(*entries)[i];
client::CustomItem* CI = (client::CustomItem*)((*obj)[*K]);
client::console.log(*K, CI->get_value());
}
}
请注意,必须明确进行两个转换:指定条目为 client::String*,并且映射项的类型为 (client::CustomItem*)。 您还应该在名称空间客户端内声明 CustomItem 有一个方法 get_value() (将被编译为 属性 上的 javascript getter 命名为 "value" ).
您也可以使用相同的模式通过 ["itemA"]
访问属性,这样:
client::CustomItem * CI = (client::CustomItem*)((*obj)["itemA"]);