【问题标题】:How to convert Map to Json object in Scala.js?如何在 Scala.js 中将 Map 转换为 Json 对象?
【发布时间】:2015-10-17 18:07:45
【问题描述】:

我正在尝试为 C3.js line chart 编写外观。

我要生成的 Javascript 代码是

var chart = c3.generate({
    data: {
        json: {
            "data1": [49.1, 20, 50, 40, 60, 50],
            "data2": [200.3, 130, 90, 240, 130, 220],
            "data3": [300.88, 200, 160, 400, 250, 250]
        }
    }
});

这就是我调用我编写的外观的方式

C3Chart.generate(scope.props.data)

问题是我无法将 C3MyChartDataset 类中的 apply 方法转换为返回一个 json 对象来发出这个对象

 json: {
        "data1": [49.1, 20, 50, 40, 60, 50],
        "data2": [200.3, 130, 90, 240, 130, 220],
        "data3": [300.88, 200, 160, 400, 250, 250]
    }

如何在 Scala-js 中将 Map 转换为 JSON 对象?

@JSName("c3")
object C3Chart extends js.Object {
  def generate(data: MyChartData): js.Dynamic = js.native
}

trait C3MyChartDataset extends js.Object {
  def json: js.Object = js.native
}

object C3MyChartDataset {
  def apply(data: Map[String, Array[Double]]): C3MyChartDataset = {
    js.Dynamic.literal(
      json = data //I need to convert this into an object
    ).asInstanceOf[C3MyChartDataset]
  }
}

trait MyChartData extends js.Object {
  def data: js.Object = js.native
}

object MyChartData {
  def apply(datasets: C3MyChartDataset): MyChartData = {
    js.Dynamic.literal(
      data = datasets
    ).asInstanceOf[MyChartData]
  }
}

更新:我尝试使用 toJSDictionary 将其转换为 Dictionary 对象。 (json = data.toJSDictionary)。但这仍然不会生成图表。使用 toJSDictionary 生成的 Javascript 对象是

data: Object
    json: Object
        Data1: $TypeData.initArray.ArrayClass
           u: Array[6]
           0: 30.1
           1: 200.1
           2: 100.1
           3: 400.1
           4: 150.1
           5: 250.1

【问题讨论】:

  • 我假设您只需要一个 JavaScript 对象,而不是 JSON 本身,对吧? (JSON 是序列化的形式,但它看起来不是您要寻找的。)
  • 对不起,我对 Javascript 很陌生。我只是想从 Scalajs 生成 C3.js 显示图表所需的 Javascript 代码 sn-p。我只需要我的地图来发出 json 对象/javascript 对象。
  • 听起来图书馆的文档令人困惑。 JSON 是 JavaScript 对象的 stringified 格式,而不是对象本身。但是是的 - 正如我在下面回答的那样,尝试将您的地图转换为 js.Dictionary,并将其分配给“json”参数。好像应该是对的……

标签: scala.js


【解决方案1】:

json 对象的类型基本上是一个字典,其值是数字数组。翻译成Scala.js类型,意思是

js.Dictionary[js.Array[Double]]

您可以将Map[String, Array[Double]] 类型的data 转换为该类型

data.mapValues(_.toJSArray).toJSDictionary

【讨论】:

  • 这工作非常感谢。这是否意味着每次我尝试加载图表时,值都会被迭代并转换为 js 对象?还是仅在将 Scala 转换为 Javascript 时才进行初始编译?
  • 每次调用apply()方法时都会转换,是的。如果您不希望发生任何转换,则必须首先在呼叫站点使用js.Dictionaryjs.Array
【解决方案2】:

假设我上面的问题是正确的,您可能需要 js.Dictionary - 这是您认为是名称/值对的普通 JavaScript 对象的常用 Scala.js 表示。请注意,它有一个 (String, A)* 构造函数,很容易从 Map 转换。

【讨论】:

  • 我试过了。使用 import scala.scalajs.js.JSConverters.toJSDictionary 得到的结果更新了我的答案。可能是导致问题的 ArrayClass :S
猜你喜欢
  • 1970-01-01
  • 2016-09-23
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多