2012-07-29 8 views
14

私はv8にC++の拡張機能を書いており、その中にArrayオブジェクトを渡したいと思います。私は入ってくる引数がIsArray()によってテストできることを知っていますが、ToArray()はありません。v8の値を配列に変換する方法

どのようにしてその長さにアクセスし、数値インデックスで要素を要求しますか?

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

である。これは、しばらくした。このように取り組んで物事を取得することができました前に、しかし、 'args [0] - > ToObject.As ();'のトリックですか? –

答えて

10

私は変換または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 
} 
+0

編集のおかげで@Morteza M. –

12

あなたは別の型にキャストするためにハンドルのCast方法を使用する必要があります。

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

これはとても近いようです!しかし、エラーC2440: '=': 'v8 :: Value *'から 'v8 :: Object * volatile'に変換できません。 .lengthプロパティを読み込むだけでいいのですか?自分自身... –

+1

これは非常に奇妙です。 'v'が' Handle 'であれば、' Cast'の使用を意図しているので、上の行はちょうどうまくコンパイルする必要があります。コンパイルエラーはどこを指していますか?ソースを投稿できますか? –

4

私は、ヴャチェスラフEgorovは以下

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

を与えた答えのそのわずかばらつきが私の成功コード

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

} 
関連する問題