2012-07-29 15 views
14

Piszę rozszerzenie C++ do wersji 8 i chcę przekazać do niego obiekt Array. Widzę, że przychodzący argument może być testowany przez IsArray(), ale nie ma ToArray().Jak przekonwertować wartość v8 na tablicę

Jak uzyskać dostęp do jego długości i żądać elementów według indeksu numerycznego?

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... ? 
    } 
... 
} 

Musi tu zabraknąć czegoś oczywistego. Obiekt może zwrócić wszystkie jego właściwości, ale to nie jest to, na co miałem nadzieję. Czy istnieje sposób, aby zdobyć go jako Arrray?

Dzięki za przeczytanie.

+1

To było jakiś czas temu, ale nie powinno się "args [0] -> ToObject.As ();" zrobić lewę? –

Odpowiedz

10

nie byłem w stanie znaleźć sposób na konwersję lub oddanych do tablicy. Może jest jakiś sposób. Ale znalazłem wykonując object->IsArray(), object->get("length")->Uint32Value() i object->get(int), mogłem po prostu chodzić tablicy.

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 
} 
+0

Dzięki za edycję @Morteza M. –

12

Cast należy użyć metody uchwytem do oddania go do innego typu:

v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(v); 
+0

Wydaje się to tak blisko! Ale pojawia się błąd Cast: błąd C2440: "=": nie można przekonwertować z "v8 :: Value *" do "v8 :: Object * volatile" Zastanawiam się teraz, czy muszę po prostu przeczytać właściwość .length ja ... –

+1

to bardzo dziwne. Wiem, że linia powyżej * musi * skompilować dobrze, jeśli 'v' jest' Handle 'ponieważ tak właśnie ma być używane' Cast'. Gdzie wskazuje błąd kompilacji? Czy możesz opublikować swoje źródło? –

4

udało mi się dostać rzeczy pracują tak, to po prostu odmiana odpowiedź Wiaczesław Jegorow dał

Local<Array> arr= Local<Array>::Cast(args[0]); 
printf("size %d\n",arr->Length()); 
Local<Value> item = arr->Get(0); 
3

Poniżej jest moja udało kod

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)); 

} 
Powiązane problemy