1

プロジェクトでunderscorejsを使用しています。map、reduce、filter groupby など、さまざまな種類の配列操作を行う必要があります。

私のデータセットは以下のようになります:

var data_list = [
     {"insertDate": "2011-12-02T00:00","value": {"paisa":10000}},
    {"insertDate": "2013-03-02T00:00","value": {"paisa":10000}
    },{"insertDate": "2013-03-02T00:00","value": {"paisa":10000}
    },{"insertDate": "2012-12-02T00:00","value": {"paisa":30000}},
  {"insertDate": "2013-04-02T00:00","value": {"paisa":10000},
    },{"insertDate": "2013-04-02T00:00","value": {"paisa":30000}
    },{"insertDate": "2013-03-02T00:00","value": {"paisa":20000}},
  {"insertDate": "2013-04-12T00:00","value": {"paisa":30000}
    },
    {"insertDate": "2012-11-02T00:00","value": {"paisa":10000}}
]

日、月、年に基づいてデータを計算したい。日の計算では、groupby を実行してから、map reduce を使用して計算します。以下のように:

var groupedByDateData = _.groupBy(data_list, "insertDate");
var aggregateByDate = _.map(groupedByDateData, function(invoiceObject, createdat) {
  return { 
     createdat: createdat, 
     val: _.reduce(invoiceObject, function(m,x) { 
       return m + x.value.paisa;
     }, 0) 
  };
});

日ベースのマップリデュースでは問題なく機能しますが、月と年の計算では、読み取り可能なコードと同じ形式で実行したいと考えています。

以下のようなデータを取得できるように、underscorejs を使用して map,reduce を行うにはどうすればよいですか?

[{"createdat": "February 2011", "val": 10000}, 
{"createdat": "March 2013", "val": 40000}, 
{"createdat": "December 2012", "val": 30000}, 
{"createdat": "April 2013", "val": 70000}, 
{"createdat": "November 2012", "val": 10000}]

年次 mapreduce の場合:

[{"createdat": "2011", "val": 10000}, 
{"createdat": "2013", "val": 110000}, 
{"createdat": "2012", "val": 70000}]

私のコードJSBINはこちら

注意: 年次および月次の削減された結果セットを取得するために、日付を分割していますが、これは最善の方法ではありません。ここで私のソリューションをチェックしてくださいhttp://jsbin.com/etepan/3/edit

前もって感謝します。

4

1 に答える 1

8

さまざまなもの (時間、月、年) でグループ化する必要があるため、キーはgroupBy.

あなたはこれを使用しています:

var groupedByDateData = _.groupBy(data_list, "insertDate");

これは次の省略形です:

var groupedByDateData = _.groupBy(data_list, function(item) {
  return item.insertDate; // returns "YYYY-MM-DDT00:00"
});

この関数を変更することで、取得するグループを変更できます。たとえば、年:

var groupedByDateData = _.groupBy(data_list, function(item) {
  // pretty crappy way of getting the year,
  // but luckily the dates are structured
  return item.insertDate.substring(0,4); 
});

// => [
//      {"createdat": "2011", "val": 10000},
//      {"createdat": "2012", "val": 40000},
//      {"createdat": "2013", "val": 110000}
//    ]

月:

var groupedByDateData = _.groupBy(data_list, function(item) {
  return item.insertDate.substring(0,7); 
});

// => [
//      {"createdat": "2011-12", "val": 10000},
//      {"createdat": "2013-03", "val": 40000},
//      {"createdat": "2012-12", "val": 30000},
//      {"createdat": "2013-04", "val": 70000},
//      {"createdat": "2012-11", "val": 10000}
//    ]

あなたの JS Bin は大いに役立ちました: http://jsbin.com/ucohoq/7/edit

于 2013-05-25T05:02:08.680 に答える