linq.js在javascript中按对象数组分组
我想使用linq.js按日期对以下数据进行分组linq.js在javascript中按对象数组分组,javascript,linq,linq.js,Javascript,Linq,Linq.js,我想使用linq.js按日期对以下数据进行分组 data2=[{ “日期”:1399298400.0, “adId”:1057946139383, “印象”:1000000 }, { “日期”:1399298400.0, “adId”:3301784671323, “印象”:535714 }……等等。 ]; 以下是我的尝试: var linq=Enumerable.From(数据2); data2=linq.GroupBy(函数(x){ 返回x.date; }).选择(功能(x){ 返回{
data2=[{
“日期”:1399298400.0,
“adId”:1057946139383,
“印象”:1000000
}, {
“日期”:1399298400.0,
“adId”:3301784671323,
“印象”:535714
}……等等。
];
以下是我的尝试:
var linq=Enumerable.From(数据2);
data2=linq.GroupBy(函数(x){
返回x.date;
}).选择(功能(x){
返回{
日期:x.Key(),
印象:x.Sum(函数(y){
返回y.impressions | 0;
})
};
}).ToArray();
但是,它不能正常工作,因为GroupBy
之前和之后的所有impressions
的总和很接近,但并不相同
在这种情况下,在linq.js中使用groupby的正确方法是什么
这里有一个完整的数据集,它可以在使用GroupBy
之前和之后提醒总印象 解决方案
您可以通过以下方式将回调作为第三个参数传递:
jinqJs().from(data2).groupBy('date').sum('impressions').select();
var group=Enumerable.from(dataArray).groupBy(“$.person”),null,(key,g)=>{
返回{
人:钥匙,,
likes:g.sum($.likes | 0)
}
}).toArray()
解释
在groupBy
中,第三个参数允许您在发出之前修改结果:
在JS中,(单个管道|
)返回第一个值(如果存在),否则返回第二个值。如果没有它,尝试将未定义的值与实值求和将返回
如果没有|0
,结果将如下所示:
jinqJs().from(data2).groupBy('date').sum('impressions').select();
本例使用速记语法,但如果您愿意在任何时候看到带美元符号的字符串,可以用lambda语法替换它,如下所示(它们的作用完全相同):
我是开源项目的作者。在jinqJs中,您可以轻松做到这一点,如下所示:
jinqJs().from(data2).groupBy('date').sum('impressions').select();
如果我还能帮上忙,请告诉我。您可以尝试按日期分组。toString()。由于JS的评估方式,可能会更安全。或者,遇到这个问题的人可能对使用linq.JS没有多少认同 如果您已经开始使用它,那么就开始吧,但是如果这是它的第一对真正的用例,那么值得注意的是,您可以在vanilla js中完成同样的事情: 对于此数据:
var数据数组=[
{人:“詹姆斯”,喜欢:100},
{人物:“詹姆斯”,喜欢:250},
{人:“凯尔”,喜欢:300},
{人:“凯尔”}
];
您可以使用每个关键点/人物的属性构建一个对象,并不断对这些道具的值求和
var obj=dataArray.reduce((acc,cur)=>{
acc[cur.person]=(acc[cur.person]| | 0)+(cur.likes | | 0)
返回acc
}, {})
如果希望它是一个对象数组,可以像这样从一个对象转换为一个数组
var数组=Object.entries(obj.map)(entry=>{
返回{person:entry[0],likes:entry[1]}
})
在我看来,|0
是问题的根源。我从另一个stackoverflow帖子复制了这个代码。|0
到底是做什么的?我应该是|
而不是|
,这意味着如果表达式左侧的对象是null
则返回右侧的值,即0
。出于好奇,那么,``会做什么呢?