Как перебрать свойства в объекте

Я хочу перебрать объект в функции V8 C ++.

NodeJS:

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

Я хочу передать «пользователь» и «пароль», как имена, так и значения в метод C ++, который принимает параметры, такие как:

AddProperty(char * name, char * value);

Количество пар имя / значение может отличаться, поэтому мне нужно общее решение.

Могу ли я получить некоторую помощь, чтобы быть на правильном пути.

Я пишу более простые обертки C ++ для Node & V8, но у меня просто заканчиваются идеи для этого 🙂

3

Решение

Предполагая, что достаточно недавно 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
}
}
6

Другие решения

Так как я только что сделал это для своего драгоценного камня, я мог бы добавить некоторые тонкие изменения к этому ответу @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 чтобы получить последний не осуждаемый способ.

4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector