2013-02-13 77 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