Meskipun Anda dapat melihat bahwa ada .GroupBy
di README di github, tidak ada .GroupBy
saat Anda melakukan npm install node-linq
. Jadi, Anda harus menginstal modul dengan
npm install https://github.com/wearefractal/node-linq/tarball/master
Ini adalah data Anda:
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 } ];
Pertama, Anda ingin mengelompokkannya. Sayangnya, Anda tidak dapat mengelompokkan berdasarkan hash sehingga Anda harus menggunakan kunci pengganti:
var o = new LINQ(data).GroupBy(function(row) { return row.date + '~' + row.name; });
console.log(o);
Ini adalah hasilnya:
{ '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 } ] }
Selanjutnya, Anda ingin menjumlahkan angka-angkanya, tetapi tidak bisa.
console.log(o.__proto__); // {}
Mungkin Anda perlu membungkusnya dengan LINQ
?
new LINQ(o); // InvalidCastException: Data not Array
Tidak.
Mari kita ubah objek menjadi array dengan kehilangan kuncinya. Tidak ada Object.values()
di JavaScript, jadi kita harus melakukannya dengan cara ini:
o = new LINQ(Object.keys(o).map(function(key) { return o[key] }));
Sekarang kita akhirnya dapat menjumlahkan semua angka:
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);
Inilah hasilnya:
[ { date: '2013/06/26', name: 'A', sum: 6 },
{ date: '2013/06/27', name: 'B', sum: 4 },
{ date: '2013/06/27', name: 'A', sum: 4 } ]
Tidak terlalu cantik.
Menggarisbawahi
npm install underscore
Berikut cara mengelompokkan data Anda menggunakan pustaka 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
Jauh lebih bagus, menurutku.
person
mak
schedule
27.06.2013