javascript linqjs group by with a sum

qybjjes1  于 2023-04-19  发布在  Java
关注(0)|答案(5)|浏览(114)

这似乎是一个简单的问题,但我正在与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)
        }
    });

上面的代码不起作用。

mo49yndu

mo49yndu1#

你几乎成功了。你的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();
w80xi6nr

w80xi6nr2#

我是开源项目http://www.jinqJs.com的作者
你可以很容易地通过执行:

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

inb24sb23#

只是进一步扩展这个问题。
以下语法将按附加字段对数据进行分组:

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();
jqjz2hbq

jqjz2hbq4#

假设你有一个类似的对象数组,你可以这样写你的查询:

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

我个人觉得使用lambda字符串语法更简洁更好。混合使用lambda和函数会导致代码更混乱。

yyyllmsg

yyyllmsg5#

原生JS更新

由于几乎所有浏览器都广泛支持JS操作,并且在必要时编译的构建工具激增,除非您已经导入linqjs,否则我建议使用原生JS方法。

const grouped = data.reduce((acc, el) => {
  const key = el.Currency.ID
  const prev = acc[key] ?? 0
  acc[key] = prev + el.Amount;
  return acc;
}, {})

Stack Snippets中的Demo

const data = [
    {
        "Amount": 5,
        "Currency": { "ID": "USD" }
    },
    {
        "Amount": 10,
        "Currency": { "ID": "USD" }
    },
    {
        "Amount": 20,
        "Currency": { "ID": "CAN" }
    }
]

const grouped = data.reduce((acc, el) => {
  const key = el.Currency.ID
  const prev = acc[key] ?? 0
  acc[key] = prev + el.Amount;
  return acc;
}, {})

console.log(grouped)

// {
//     "USD": 15,
//     "CAN": 20
// }

参见How to group by and sum an array of objects?

相关问题