2013-02-13 53 views
2

我有下面的代码重新格式化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" => { 

感谢以下。

回答

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]))) 
      } 
     }) 
0

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

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

其实我已经试过了,问题是比赛并不详尽,并最终导致一个MatchError – chiappone 2013-02-13 16:01:47

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]))) 
    } 
    })) 
+0

我其实已经试过这个,问题是匹配并不详尽,最终导致MatchError – chiappone 2013-02-13 16:01:17

+0

这是一个局部函数,它不应该说你没有详尽的匹配... – t3hnar 2013-02-13 21:56:26