linqjs группа с суммой

Это может показаться простым вопросом, но я борюсь с синтаксисом 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)
                }});

Код выше не работает.

5 ответов

Решение

У тебя почти было это. Ваш ключевой селектор в 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();

Я являюсь автором проекта с открытым исходным кодом http://www.jinqjs.com/

Вы можете легко сделать это, выполнив:

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

Предполагая, что у вас есть массив объектов, который выглядит так, вы можете написать свой запрос следующим образом:

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

Лично я считаю использование синтаксиса лямбда-строк более лаконичным и предпочтительным. Смешение лямбд и функций приводит к более сложному коду ИМХО.

Обновление с помощью Native 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;
}, {})

Демо в фрагментах стека

См. также: Как группировать и суммировать массив объектов?

Просто чтобы продолжить в этом вопросе.

Следующий синтаксис сгруппирует данные по дополнительному полю:

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();
Другие вопросы по тегам