0

Javascript関数に次のJSONデータがあります(ここでは簡略化されています)。

var data = [
  { Expiry: "2013-01-02T00:00:00", EndDate: "2013-01-16T00:00:00", Category: 10, Amount: 14.53 },
  { Expiry: "2013-01-02T00:00:00", EndDate: "2013-01-16T00:00:00", Category: 25, Amount: 14.86 },
  { Expiry: "2013-02-06T00:00:00", EndDate: "2013-02-20T00:00:00", Category: 10, Amount: 14.43 },
  { Expiry: "2013-02-06T00:00:00", EndDate: "2013-02-20T00:00:00", Category: 25, Amount: 14.76 }
];

注:EndDate値は、特定のExpiry値に対して常に同じになります。

理想的には、最後に次のJSONを付けたいと思います(有効期限でグループ化され、プロパティ名でのカテゴリ値の使用に注意してください)。

[
   {
     Expiry: 2013/1/2,     (note: not fussed about the date format)
     EndDate: 2013/1/16,
     Category10: 14.53,
     Category25: 14.86
   },
   {
     Expiry: 2013/2/6,
     EndDate: 2013/2/20,     
     Category10: 14.43,
     Category25: 14.76
   },
]

しかし、すべてを一度に取得できるかどうかはわかりません。そのため、各日付ペアの下にある一連のカテゴリと金額を処理して、上記を何らかの方法で取得することができます。

[
   {
     Expiry: 2013/1/2,    
     EndDate: 2013/1/16,
     Categories: [ { 10, 25 } ],
     Amounts: [ { 14.53, 14.86 } ]
   },
   {
     Expiry: 2013/2/6,
     EndDate: 2013/2/20,
     Categories: [ { 10, 25 } ],
     Amounts: [ { 14.43, 14.76 } ]
   },
]

linq.jsライブラリのgroupby関数を使用して必要なJSONを取得しようとしていますが、必要なものに到達できません。

次のように:

var result = linq.groupBy("$.Expiry", "", "k,e => { Expiry: k, Categories: e.select('$.Category').toArray(), Amounts: e.select('$.Amount').toArray()}").toArray();

私は得る:

[
   {
     Expiry: 2013/1/2,    
     Categories: [ { 10, 25 } ],
     Amounts: [ { 14.53, 14.86 } ]
   },
   {
     Expiry: 2013/2/6,
     Categories: [ { 10, 25 } ],
     Amounts: [ { 14.43, 14.76 } ]
   },
]

しかし、EndDateを取得する方法を理解することはできません...

誰かが助けることができますか?

タ、

4

1 に答える 1

5

キーは、との両方を含む複合キーである必要がExpiryありEndDateます。次に、それを結果に含めることができます。

理想的な結果を得ようとすることはお勧めしません。そのような結果を作成することは、LINQが行うように作られた精神とは異なります。むしろ、クエリしているアイテムを収集する必要があります。

var query = Enumerable.From(data)
    .GroupBy(
        "{ Expiry: $.Expiry, EndDate: $.EndDate }",
        null,
        "{ Expiry: $.Expiry, EndDate: $.EndDate, Categories: $$.Select('$.Category').ToArray(), Amounts: $$.Select('$.Amount').ToArray() }",
        "$.Expiry + '-' + $.EndDate" // compare selector needed
    )
    .ToArray();

ただし、理想的な結果を得ることができる場合もありますが、この方法は使用しないことをお勧めします。

var query = Enumerable.From(data)
    .GroupBy(
        "{ Expiry: $.Expiry, EndDate: $.EndDate }",
        null,
        function (key, g) {
            return g.Aggregate({
                Expiry: key.Expiry,
                EndDate: key.EndDate
            }, function (result, item) {
                result['Category' + item.Category] = item.Amount;
                return result;
            });
        },
        "$.Expiry + '-' + $.EndDate"
    )
    .ToArray();
于 2013-03-26T21:31:05.760 に答える