2012-07-29 15 views
14

मैं v8+ एक्सटेंशन को v8 में लिख रहा हूं, और इसमें ऐरे ऑब्जेक्ट को पास करना चाहता हूं। मुझे लगता है कि आने वाले तर्क का परीक्षण 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... ? 
    } 
... 
} 

यहां कुछ स्पष्ट याद आना चाहिए। ऑब्जेक्ट अपनी सभी संपत्तियों को वापस कर सकता है, लेकिन यह वही नहीं है जो मैं उम्मीद कर रहा था। क्या इसे एरेरे के रूप में प्राप्त करने का कोई तरीका है?

पढ़ने के लिए धन्यवाद।

+1

इसमें कुछ समय था है पहले, लेकिन 'तर्क नहीं' [0] -> ToObject.As (); 'चाल करो? –

उत्तर

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 एम। –

12

आप एक अलग प्रकार के लिए यह कास्ट करने के लिए एक संभाल के Cast विधि का उपयोग करना चाहिए:

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

यह बहुत करीब लगता है! लेकिन मुझे एक कास्ट त्रुटि मिलती है: त्रुटि C2440: '=': 'v8 :: Value *' से 'v8 :: ऑब्जेक्ट * अस्थिर' से कनवर्ट नहीं किया जा सकता है अब मुझे आश्चर्य है कि मुझे केवल। लम्बाई संपत्ति पढ़नी है खुद ... –

+1

यह बहुत अजीब है। मुझे पता है कि उपर्युक्त रेखा * ठीक * संकलित होनी चाहिए यदि 'v' है ' संभाल लें' क्योंकि इस प्रकार 'कास्ट' का उपयोग किया जाना है। संकलन त्रुटि कहां इंगित करता है? क्या आप अपना स्रोत पोस्ट कर सकते हैं? –

4

मैं इस तरह काम कर बातें कर रहा था, इसकी सिर्फ जवाब का एक परिवर्तन Vyacheslav 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)); 

} 
संबंधित मुद्दे