如何根据地图标量中的值过滤掉键和值

时间:2013-02-13 06:17:30

标签: scala

我有以下代码将Json对象重新格式化为另一个Json对象:

 val newJson = Json.toJson(retJson.fields.flatMap {
      case (epoch, obj) => obj.as[JsObject].fields.map(epoch -> _)
    }.groupBy(_._2._1)
    .mapValues(
      _.map {
        case (epoch, (k, v)) => {
          var epochDate = epoch.substring(0, 13).toLong
          epochDate = convertEpoch(epochDate, timezoneOffset)
          Seq[Double](epochDate, sensorCalculations(whatevers, Option(v.as[String])))
        }
      }))

这很好但我们有一个新的要求,当一个值为-1时,我们应该忽略这个元素,而不是在结果中包含它。我不知道如何正确地做到这一点。

---编辑---

我尝试过以下操作会导致匹配错误

case (epoch, (k, v)) if v.as[String] != "-1" => {

感谢。

3 个答案:

答案 0 :(得分:0)

您可以在适当的位置添加if子句。例如,可以检查值k:

....
case (epoch, (k, v)) if(!(k==-1))=> {
...

答案 1 :(得分:0)

val newJson = Json.toJson(retJson.fields.flatMap {
  case (epoch, obj) => obj.as[JsObject].fields.map(epoch -> _)
}.groupBy(_._2._1)
  .mapValues(
  _.collect {
    case (epoch, (k, v)) if v != -1 => {
      var epochDate = epoch.substring(0, 13).toLong
      epochDate = convertEpoch(epochDate, timezoneOffset)
      Seq[Double](epochDate, sensorCalculations(whatevers, Option(v.as[String])))
    }
  }))

答案 2 :(得分:0)

以下解决方案对我有用:

   val il = for {
      (epoch, obj) <- retJson.fields
      (k, v) <- obj.as[JsObject].fields
      if v.as[String] != "-1"
    } yield (epoch, (k, v))

    val mapResult = il.groupBy(_._2._1)
      .mapValues(
        _.map {
          case (epoch, (k, v)) => {
            var epochDate = epoch.substring(0, 13).toLong
            epochDate = convertEpoch(epochDate, timezoneOffset)
            Seq[Double](epochDate, sensorCalculations(whatevers, Option(v.as[String])))
          }
        })
相关问题