如何迭代Object中的属性

时间:2015-02-22 13:45:04

标签: c++ node.js v8 embedded-v8

我想在V8 C ++函数中迭代一个Object。

的NodeJS:

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

我想传递"用户"和"密码",C ++方法的名称和值,它采用如下参数:

AddProperty(char * name, char * value);

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

我可以获得一些帮助,以便走上正轨。

我一直在为Node和amp;编写更简单的C ++包装器。 V8,但我刚刚用完了这个想法:)

2 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:4)

由于我刚刚为我的宝石做了这个,我可能会在@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以获取最新的非弃用方式。