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