linqjs group with a sum

时间:2013-07-24 01:59:12

标签: javascript jquery linq linq.js

这似乎是一个简单的问题,但我正在努力使用linqjs语法。

给出以下基本JSON:

{
        "DateEvent": "2013-04-23 14:00:00Z",
        "DateRecord": "2013-04-23 14:00:00Z",
        "Amount": -9500,
        "Type": {
            "Description": "Capital"
        },
        "Currency": {
            "ID": "USD",
        }
}

使用linqjs如何返回每种货币的总额?

Enumerable.From(data)
    .GroupBy("{ currency: $.Currency.ID }", null, 
        function (key, g) {
            var result = {
                    currency: key.currency,
                    total: g.Sum($.Amount)
                }});

上面的代码不起作用。

4 个答案:

答案 0 :(得分:6)

你几乎拥有它。 GroupBy和Sum中的键选择器不正确。键选择器也需要是一个字符串。请尝试以下方法:

var result = Enumerable.From(data).GroupBy("$.Currency.ID", null,
    function (key, g) {
        var result = {
            currency: key,
            total: g.Sum("$.Amount")
        }
        return result;
    }).ToArray();

答案 1 :(得分:1)

进一步扩展这个问题。

以下语法将通过其他字段对数据进行分组:

var result = Enumerable.From(data)
                       .GroupBy("{ currency: $.Currency.ID, type: $.Type.Description }", null,
                            function (key, g) {
                                var result = {
                                     currency: key.currency,
                                     type: key.type,
                                     total: g.Sum("$.Amount")
                                }
                                return result;
                                }, function (x) { return x.currency + ':' + x.type }).ToArray();

答案 2 :(得分:1)

假设您有一组看起来像这样的对象,您可以像这样编写查询:

var query = Enumerable.From(data)
    .GroupBy(
        "{ Currency: $.Currency.ID, Type: $.Type.Description }",
        "$.Amount",
        "{ Currency: $.Currency, Type: $.Type, Total: $$.Sum() }"
    )
    .ToArray();

我个人认为使用lambda字符串语法更简洁,更可取。混合lambda和函数会导致代码混乱。

答案 3 :(得分:1)

我是开源项目http://www.jinqJs.com

的作者

您可以通过执行以下操作轻松完成:

jinqJs().from(data).groupBy('Currency').sum('Amount').select();