LoginSignup
4
6

More than 5 years have passed since last update.

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

Posted at

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

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6