Posted at

JSBでC++のmapをJavascriptのオブジェクトとして返す方法

More than 5 years have passed since last update.

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です。