【问题标题】:javascript linq.js groupbyjavascript linq.js groupby
【发布时间】:2013-03-26 16:28:28
【问题描述】:

我在 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 }
];

注意:对于任何特定的 Expiry 值,EndDate 值将始终相同。

现在理想情况下,我希望最后有以下 JSON(按到期日期分组,并注意在属性名称中使用 Category 值):

[
   {
     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...

有人可以帮忙吗?

塔,

【问题讨论】:

    标签: javascript group-by linq.js


    【解决方案1】:

    您的密钥应该是包含ExpiryEndDate 的复合密钥。然后你可以将它包含在你的结果中。

    我不建议尝试获得理想的结果,创建这样的结果不符合 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();
    

    【讨论】:

    • 完美的答案,正是需要的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 2019-05-24
    相关资源
    最近更新 更多