Как преобразовать значение 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));

 }