2015-02-22 3 views
3

Я хочу выполнить итерацию через объект в функции V8 C++.Как перебрать свойства в объекте

NodeJS:

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

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

AddProperty(char * name, char * value); 

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

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

Я пишу простые C++ обертками для узла & V8, но я просто бегу из идей для этого одного :)

ответ

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 
    } 
} 
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, чтобы получить последний неисчерпаемый способ.

Смежные вопросы