2016-07-17 20 views
1

私はscala.jsを新しくしています。実際には、応答はJSON-アレイであるscala.js:jQuery経由でロードされたJSON配列をマップします。

val req = jQuery.ajax(literal(
    url = ..., 
    `type` = "GET", 
    async = false).asInstanceOf[JQueryAjaxSettings] 
) 
val res = req.selectDynamic("responseText").toString 

:現在、私は(非非同期フラグは意図的なものです)、以下でこだわっています。配列内の各項目にはnameというフィールドがありますが、これは保証されており、検証する必要はありません。私がしたいことは.mapの名前フィールドへの各エントリであり、その結果出力は要素の名前だけを含むArray[String]です。それをどうすれば実現できますか?

答えて

2

Hmm。非同期フラグは非難されて以来長いことに注意してください。私はそれがもはや利用可能であったことに気付かなかった。しかし、これを読んだとして、ここには大雑把に関係するものがあります。

私の印象は、実際には配列をエンコードしているJSON文字列であるという印象です。ケースということを、最初のステップは、それを解析することです:

JSON文字列を解析し、あなたのJSオブジェクトの「生」の形式で js.Dynamicを与える
val rawArray:js.Dynamic = JSON.parse(res) 

。この時点で、Scala.jsはその構造について何も知らない。

@js.native 
trait MyStruct extends js.Object { 
    val name:String = js.native 
} 

これは、あなたがJavaScriptのタイプについてScala.jsに指示する方法である:

次に、あなたはあなたの配列の各要素の構造がどのようなものかScala.jsすることを説明すべきです。この型には "name"という名前のプロパティがあります。これはString型です。あなたは好きなようにタイプの他のフィールドを追加することができます - あなたはnameを気にしているように聞こえるので、残りをリストする必要はありません。 - それはちょうど私は、これはJSことを知っている」、Scala.jsに宣言されて

val myArray = rawArray.asInstanceOf[js.Array[MyStruct]] 

asInstanceOfはない変更何もしない:

その後、あなたはあなたのrawArrayが本当に何であるかScala.jsを教えてください。 Dynamicは実際はMyStructの配列です。だから今は、js.Array[MyStruct]あるmyArrayを、持っていて、通常通りmapを使用することができます。

val myNames = myArray.map(_.name) 

あなたはScala.jsと生のJavaScriptの境界で動作しているときのもののこの種はかなり正常です。 JSレベルは完全に型なしであり、SJSレベルは厳密に型指定されているので、JSレベルから出て来る実際の型が何であるかをSJSに教えなければなりません。それでは、SJSコードの残りの部分でそれらの型を仮定することができます...

+0

ありがとう、それは有望そうです。私は現時点では忙しいですが、今後数日以内にそれを調べます。 – ceran

+0

完璧に動作します、ありがとう – ceran

関連する問題