2012-07-29 109 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 ();'做窍门? – 2013-02-16 05:11:19

回答

10

我没能找到一种方法来转换或转换成数组。也许有一种方法。但我通过做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. – 2012-11-03 00:07:17

12

你应该使用一个手柄Cast方法将其转换为不同的类型:

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

这似乎太接近了!但我得到一个转换错误:错误C2440:'=':无法从'v8 :: Value *'转换为'v8 :: Object * volatile' 我想知道现在是否只需读取.length属性我自己... – 2012-07-29 15:35:20

+1

这很奇怪。我知道,如果'v'是'Handle ',那么上面的*行必须编译得很好,因为这就是Cast的意图。编译错误指向哪里?你可以发布你的来源? – 2012-07-29 21:46:45

4

我能够把事情的工作就是这样,它只是答案的变化维亚切斯拉夫·叶戈罗夫给

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

}