cocos2d-jsにおいてC++のmap要素をJavaScript(以下js)のオブジェクトとして返したいケースはよくあります。
ネットで検索をかけてもなかなか見つからないので、cocos2d-xのscriptingの中を探って実装方法を探ってみました。
で、見つかったのがJS_DefineProperty
です。
こちらを使えば、JSObjectにプロパティを追加できます。
jsにおいては変数オブジェクトは連想配列に等しく、プロパティとはまさにキーの役割を果たします。
なので、こちらのメソッドを利用することで、js上でも連想配列を返すことが可能になったと言えます。
スニペットで恐縮ですが、こんな感じでmapの全要素をjsのプロパティに置き換えてやります。
JSObject *object = JS_NewObject(_cx, NULL, NULL, NULL );
JSBool result = JS_TRUE;
std::map< std::string, std::string >::const_iterator it = params.begin();
while(it != params.end()){
CCLOG("%s => %s",it->first.c_str(), it->second.c_str());
JSString* jsValue = JS_NewStringCopyN(_cx, it->second.c_str(), it->second.length());
result &= JS_DefineProperty(_cx, object, it->first.c_str(), STRING_TO_JSVAL(jsValue), NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT);
++it;
}
あとはJSObjectをjsval等に変換してやり、渡してやればOKです。