2016-04-27 9 views
2

にJSONデータを要約:私はjavascript関数の内部で、このオブジェクトを解析したいグループと私はangularJSを使用し、次のようなAPIレスポンスからJSONオブジェクトを持っています新しいJSONオブジェクト

var data = [ 
    {"group": "red", "state": "running"}, 
    {"group": "red", "state": "closed"}, 
    {"group": "red", "state": "closed"}, 
    {"group": "blue", "state": "running"}, 
    {"group": "blue", "state": "running"} 
]; 

以下の結果が得られます。

var sumdata = [ 
    {"group": "red", "running": 1, "closed": 2, "summary": 3}, 
    {"group": "blue", "running": 2, "closed": 0, "summary": 2} 
]; 

だから、私は、このグループの状態を実行しているどのように多くのオブジェクトを数え、グループに「グループ」と呼ばれる最初のプロパティを持って、状態を閉じても、オブジェクトの数をまとめました。

(注意: を私はLINQ.js のような余分のJavaScriptライブラリを使用したくない)

よ、私を助けてくださいもらえますか?

私は、次のことを試してみましたことにより、グループが欠落しているとどのようにこの機能の中にそれを置くには考えていない:これは一時的なオブジェクトやプレーンなJavaScriptでArray#forEachループを備えた提案である

var getSum = function (data) { 

    if (!data) { 

     $scope.data = []; 
    } 
    else { 

     for (var i = 0; i < data.length; i++) { 

      var group = data[i][0]; 
      var status = data[i][1]; 

      status = (status ? status.Name : "").toUpperCase(); 

      var running = 0; 
      var closed = 0; 

      switch (status) { 

       case "RUNNING": 
        running++; 
        break; 

       case "CLOSED": 
        closed++; 
        break; 

       default: 
        break; 
      } 
      var summary = running + closed;   
      $scope.dataSum.push({ "group": group, "running": running, "closed": closed, "summary": summary}); 
     } 
    } 

}; 
+2

何を試しましたか?これまでに使用したコードを投稿してください。これは一般的に「私たちはあなたのためのコードを書いていません」 – Draken

+1

人々は無料のコードサービスのためにそう間違っている...コメントはありません – thegio

答えて

2

を。 LINQパワーで

var data = [{ "group": "red", "state": "running" }, { "group": "red", "state": "closed" }, { "group": "red", "state": "closed" }, { "group": "blue", "state": "running" }, { "group": "blue", "state": "running" }], 
 
    grouped = function (array) { 
 
     var r = []; 
 
     array.forEach(function (a) { 
 
      if (!this[a.group]) { 
 
       this[a.group] = { group: a.group, running: 0, closed: 0, summary: 0 }; 
 
       r.push(this[a.group]); 
 
      } 
 
      this[a.group][a.state]++; 
 
      this[a.group].summary++; 
 
     }, Object.create(null)); 
 
     return r; 
 
    }(data); 
 

 
document.write('<pre>' + JSON.stringify(grouped, 0, 4) + '</pre>');

+1

ありがとう、それはトリックを行い、私は何を試した短いです。 (私はあなたの解決策をsummaryプロパティで拡張しています) –

+0

右、私はそれを見逃していました。 –

0

それはそのようなことになります。以下のフィールドの任意の数の作品を切り取ら

var data = [{ 
 
    "group": "red", 
 
    "state": "running" 
 
}, { 
 
    "group": "red", 
 
    "state": "closed" 
 
}, { 
 
    "group": "red", 
 
    "state": "closed" 
 
}, { 
 
    "group": "blue", 
 
    "state": "running" 
 
}, { 
 
    "group": "blue", 
 
    "state": "running" 
 
}]; 
 

 

 
var result = Enumerable.From(data).GroupBy('$.group', null, function(key, group) { 
 
    return { 
 
    group: key, 
 
    running: group.Where(function(value) { 
 
     return value.state == 'running' 
 
    }).Count(), 
 
    closed: group.Where(function(value) { 
 
     return value.state == 'closed' 
 
    }).Count(), 
 
    summary: group.Where(function(value) { 
 
     return value.state == 'running' || value.state == 'closed' 
 
    }).Count() 
 
    } 
 
}).ToArray() 
 

 
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.js"></script>

+0

'' Enumerable 'は定義されていません '...スクリプトが正しく読み込まれていないようです... –

+0

@NinaScholz https://cdnjs.cloudflare.com/ajax/libs/linq.js/2.2へのアクセス権があるかどうかを確認してください.0.2/linq.jsまたは他のCDNに切り替え –

+0

私はcloudflareへのアクセス権がありません。 –

0

をデータ配列。グループ化するフィールドの名前だけを指定します。他の例よりも優れています。それは、あなたが提案したような名前のデータだけでなく、どんな種類のデータでも機能します。 希望します。

(function(){ 
     var data = [ 
         { "group": "red", "state": "running" }, 
         { "group": "red", "state": "closed" }, 
         { "group": "red", "state": "closed" }, 
         { "group": "blue", "state": "running" }, 
         { "group": "blue", "state": "running" }, 
         { "group": "blue", "state": "asd", "value":"33" }, 
         { "group": "blue", "state": "asd1", "value":"33" }, 
         { "group": "red", "state": "asd", "value":"33" } 
     ], 
     grouped = function (array) { 
      var r = []; 
      var groupFieldName = "group"; 

      array.forEach(function (a) { 
       var self = this; 
       if (!self[a[groupFieldName]]) { 
        var tempObj = { 
         group: a[groupFieldName] 
        }; 
        self[a[groupFieldName]] = tempObj; 
        r.push(self[a[groupFieldName]]); 
       } 
       var keys = Object.keys(a); 
       keys.forEach(function(key){ 
        if(key != groupFieldName){ 
         if(self[a[groupFieldName]][a[key]] == undefined){ 
          self[a[groupFieldName]][a[key]] = 1; 
         }else{ 
          self[a[groupFieldName]][a[key]]++; 
         } 
        } 
       }); 
      }, Object.create(null)); 
      return r; 
     }(data); 
     console.log(JSON.stringify(grouped)); 

})() 
+0

ありがとうございます。私の現在のソリューションでは、テーブルに表示されている「実行中」と「終了」統計だけが必要です。しかし、あなたが書いたように、あなたのソリューションは良い点であるあらゆる種類のデータで動作します。 –

+0

うれしい私は助けることができます。 –

関連する問題