2017-03-15 5 views
1

このように、オブジェクトをパラメータの1つとして受け入れるこのduktape関数があります。通常の状況下では、各オブジェクト属性の値を取得するために、duk_get_prop()duk_push_string()を使用しますが、これは私が取得しているオブジェクトの構造を事前に知っていることを前提としています。Duktapeの未知のオブジェクトを反復する

ここで、未知の構造を持つオブジェクトを受け入れる関数を考えてみましょう。私はそのキーを繰り返し処理し、そのすべての値を取得する必要があります。

私はmyFunction({foo: 12, bar: 43})と同様に動作するはずですJavascriptを myFunction({x: 1, y: 3, z: 35})から呼び出し、例えばC++ std::map<string, string> にそのようなオブジェクトを変換しようとしています。

duk_enum()がこれに適した機能になると思われますが、どのように動作するのかは十分に分かりません。

答えて

1

duk_enumのための基本的なイディオムは、()である:

/* Assume target object to enumerate is at obj_idx. 
* For a function's 1st argument that would be 0. 
*/ 

duk_enum(ctx, 0 /*enum_flags*/); /* Pushes enumerator object. */ 
while (duk_enum(ctx, -1, 1 /*get_value*/)) { /* -1 points to enumerator, here top of stack */ 
    /* Each time duk_enum() finds a new key/value pair, it 
    * gets pushed to the value stack. So here the stack 
    * top is [ ... enum key value ]. Enum is at index -3, 
    * key at -2, value at -1, all relative to stack top. 
    */ 

    printf("enumerated key '%s', value '%s'\n", duk_safe_to_string(ctx, -2), duk_safe_to_string(ctx, -1)); 

    /* When you're done with the key/value, pop them off. */ 
    duk_pop_2(ctx); 
} 
duk_pop(ctx); /* Pop enumerator object. */ 

あなたは、値が自動的にプッシュしたいduk_nextの「GET_VALUE」引数に0を渡す()、および鍵だけをポップしていない場合ループの終わりに。

列挙する内容を制御するduk_enum()フラグがあります。 0は "for(var k in obj){...}"列挙に対応する。

+0

はい、これはこの質問を投稿した直後であることがわかったので、私はすぐに自分自身に答えることができず、後でそれを忘れてしまいました。ありがとう! – Adrien

関連する問題