Итак, у меня есть функция duktape, которая принимает объект в качестве одного из параметров. При нормальных обстоятельствах, чтобы получить значения каждого из атрибутов объектов, я бы использовал duk_get_prop()
а также duk_push_string()
однако это предполагает, что я заранее знаю структуру получаемого объекта.
Теперь рассмотрим функцию, которая принимает объект с неизвестной структурой. Мне нужно перебрать его ключи и получить все его значения.
Я пытаюсь преобразовать такой объект в C ++ std::map<string, string>
Например, звонок из Javascript
myFunction({x: 1, y: 3, z: 35})
должен работать так же, как myFunction({foo: 12, bar: 43})
,
Кажется, что duk_enum()
было бы подходящей функцией для этого, но я не совсем понимаю, как это работает.
Основная идиома для 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. */
Если вы не хотите, чтобы значение автоматически выдвигалось, передайте 0 для аргумента «get_value» функции duk_next () и вставьте только ключ в конце цикла.
У duk_enum () есть набор флагов для управления тем, что вы хотите перечислить. 0 соответствует перечислению for (var k in obj) {…}.
Других решений пока нет …