Как преобразовать значение v8 в массив
Я пишу расширение С++ для v8 и хочу передать в него объект Array. Я вижу, что входящий аргумент может быть проверен IsArray(), но нет ToArray().
Как вы получаете доступ к своей длине и запрашиваете элементы по числовому индексу?
Handle<Value> MyExtension(const Arguments& args)
{
Handle<Value> v = args[0];
if(v->IsArray())
{
// convert to array, find its length, and access its members by index... ?
}
...
}
Нужно пропустить что-то очевидное здесь. Объект может вернуть все его свойства, но это не совсем то, на что я надеялся. Есть ли способ получить это как "Arrray"?
Спасибо за чтение.
Ответы
Ответ 1
Мне не удалось найти способ конвертировать или передавать в Array. Может быть, путь. Но я нашел, выполнив object->IsArray()
, object->get("length")->Uint32Value()
и object->get(int)
, я мог просто ходить по массиву.
v8::Handle<v8::Object> obj;
// ... init obj from arguments or wherever ...
int length = 0;
if(obj->IsArray())
{
length = obj->Get(v8::String::New("length"))->ToObject()->Uint32Value();
}
for(int i = 0; i < length; i++)
{
v8::Local<v8::Value> element = obj->Get(i);
// do something with element
}
Ответ 2
Вы должны использовать метод Cast
дескриптора, чтобы применить его к другому типу:
v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(v);
Ответ 3
Я смог заставить все работать так, просто его вариант ответа Вячеслав Егоров дал
Local<Array> arr= Local<Array>::Cast(args[0]);
printf("size %d\n",arr->Length());
Local<Value> item = arr->Get(0);
Ответ 4
Ниже приведен мой преуспевший код
v8::Handle<v8::Value> obj(args[0]);
if(obj->IsArray()){
v8::Local<v8::Array> arr= v8::Local<v8::Array>::Cast(args[0]);
v8::String::Utf8Value key(arr->Get(0));
v8::String::Utf8Value value(arr->Get(1));
}