我想在V8 C ++函数中迭代一个Object。
的NodeJS:
node.addProperties({"user":"testuser","password":"passwd"};
我想传递"用户"和"密码",C ++方法的名称和值,它采用如下参数:
AddProperty(char * name, char * value);
名称/值对的数量可能不同,因此我需要一个通用解决方案。
我可以获得一些帮助,以便走上正轨。
我一直在为Node和amp;编写更简单的C ++包装器。 V8,但我刚刚用完了这个想法:)
答案 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
以获取最新的非弃用方式。