如何迭代 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"]);