2017-03-15 10 views
1

그래서 객체를 매개 변수 중 하나로 받아들이는 duktape 함수가 있습니다. 정상적인 상황에서 각 객체 속성의 값을 검색하려면 duk_get_prop()duk_push_string()을 사용합니다. 그러나 이것은 내가 얻고있는 객체의 구조를 미리 알고 있다고 가정합니다.Duktape의 알려지지 않은 객체 반복

이제 구조가 알려지지 않은 개체를 허용하는 함수를 생각해보십시오. 나는 그것의 키를 반복하고, 모든 값을 가져와야한다.

나는 myFunction({foo: 12, bar: 43})뿐만 아니라 작동합니다 자바 스크립트 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