3

我想遍历 V8 C++ 函数中的对象。

节点JS:

node.addProperties({"user":"testuser","password":"passwd"};

我想将“用户”和“密码”,名称和值传递给 C++ 方法,该方法采用以下参数:

AddProperty(char * name, char * value);

名称/值对的数量可能不同,所以我需要一个通用的解决方案。

我能不能得到一些帮助才能走上正轨。

我一直在为 Node 和 V8 编写更简单的 C++ 包装器,但我对这个的想法已经不多了 :)

4

2 回答 2

6

假设最近足够新的 v8(io.js 或节点 0.12),the_object从 js 传递的对象在哪里

Local<Array> property_names = the_object->GetOwnPropertyNames();

for (int i = 0; i < property_names->Length(); ++i) {
    Local<Value> key = property_names->Get(i);
    Local<Value> value = the_object->Get(key);

    if (key->IsString() && value->IsString()) {
        String::Utf8Value utf8_key(key);
        String::Utf8Value utf8_value(value);
        AddProperty(*utf8_key, *utf8_value);
    } else {
        // Throw an error or something
    }
}
于 2015-02-23T16:31:24.177 回答
4

由于我只是为我的 gem 做了这个,我可能会通过 @Esailija 为这个答案添加一些微妙的变化,现在已弃用:

if (value->IsObject()) {
    Local<Context> context = Context::New(isolate);
    Local<Object> object = value->ToObject();
    MaybeLocal<Array> maybe_props = object->GetOwnPropertyNames(context);
    if (!maybe_props.IsEmpty()) {
        Local<Array> props = maybe_props.ToLocalChecked();
        for(uint32_t i=0; i < props->Length(); i++) {
           Local<Value> key = props->Get(i);
           Local<Value> value = object->Get(key);
           // do stuff with key / value
        }
    }

 }

主要的补充是

  • 你必须有一个上下文来获取属性名称,旧的方法正在被弃用
  • 将值转换为对象时需要小心

现在可以使用,但请务必检查v8.h以获取最新的非弃用方式。

于 2016-05-11T23:53:51.340 回答