gpt4 book ai didi

javascript - Groupby 和 LINQ Node js

转载 作者:行者123 更新时间:2023-11-30 08:06:30 24 4
gpt4 key购买 nike

我使用 node-linq 并尝试理解 GroupBy,但是文档太少了

例如我有这个数据:

{"date":"2013/06/26","name":"A","number":1}

{"date":"2013/06/26","name":"A","number":5}

{"date":"2013/06/27","name":"B","number":4}

{"date":"2013/06/27","name":"A","number":4}

我想像这样写查询,但使用 LINQ for node js

SELECT date, name, SUM(number)
FROM data
GROUPBY date, name

我尝试了这段代码,但出现了错误

var o = new LINQ(data)
.Select(function(name,d) {return name.statement,d.date;})
.SUM((function(x) {return x.number;)
.GroupBy(function(name,d) {return name.statement,d.date;}
.ToArray()

有人对 GroupBy 有任何建议或只是一些例子吗?谢谢

最佳答案

虽然你可以在github上的README中看到.GroupBy,但是当你执行npm install node-linq时没有.GroupBy >。所以你必须安装模块

npm install https://github.com/wearefractal/node-linq/tarball/master

这是您的数据:

var LINQ = require('node-linq').LINQ;

var data = [ { date: '2013/06/26', name: 'A', number: 1 },
{ date: '2013/06/26', name: 'A', number: 5 },
{ date: '2013/06/27', name: 'B', number: 4 },
{ date: '2013/06/27', name: 'A', number: 4 } ];

首先,您要对它们进行分组。不幸的是,您不能按哈希分组,因此您必须使用代理键:

var o = new LINQ(data).GroupBy(function(row) { return row.date + '~' + row.name; });
console.log(o);

这是输出:

{ '2013/06/26~A':
[ { date: '2013/06/26', name: 'A', number: 1 },
{ date: '2013/06/26', name: 'A', number: 5 } ],
'2013/06/27~B': [ { date: '2013/06/27', name: 'B', number: 4 } ],
'2013/06/27~A': [ { date: '2013/06/27', name: 'A', number: 4 } ] }

接下来,您想对这些数字求和,但您做不到。

console.log(o.__proto__); // {}

也许您需要将它包装在 LINQ 中?

new LINQ(o); // InvalidCastException: Data not Array

没有。

让我们通过丢失键将对象转换为数组。 JavaScript 中没有 Object.values(),所以我们必须这样做:

o = new LINQ(Object.keys(o).map(function(key) { return o[key] }));

现在我们终于可以对所有数字求和了:

o = o.Select(function(rows) { return { date: rows[0].date, name: rows[0].name, sum: new LINQ(rows).Sum(function(row) { return row.number; }) } }).ToArray();
console.log(o);

这是结果:

[ { date: '2013/06/26', name: 'A', sum: 6 },
{ date: '2013/06/27', name: 'B', sum: 4 },
{ date: '2013/06/27', name: 'A', sum: 4 } ]

不是很漂亮。

下划线

npm 安装下划线

下面是如何使用 underscore 库对数据进行分组。

var _ = require('underscore')._;

var data = [ { date: '2013/06/26', name: 'A', number: 1 },
{ date: '2013/06/26', name: 'A', number: 5 },
{ date: '2013/06/27', name: 'B', number: 4 },
{ date: '2013/06/27', name: 'A', number: 4 } ];

var grouper = function(row) { return row.date + '~' + row.name; };
var summer = function(rows) { return rows.reduce(function(sum, row) { return sum + row.number; }, 0); };

var o = _.chain(data)
.groupBy(grouper)
.map(function(rows) { return { date: rows[0].date, name: rows[0].name, sum: summer(rows) }; })
.value();

console.log(o); // same result

我觉得好多了。

关于javascript - Groupby 和 LINQ Node js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17346417/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com