javascript - linq.js 按 javascript 中的对象数组分组

标签 javascript linq linq.js

我想使用 linq.js 按日期对以下数据进行分组。

data2 = [{
    "date": 1399298400.0,
    "adId": 1057946139383,
    "impressions": 1000000
  }, {
    "date": 1399298400.0,
    "adId": 3301784671323,
    "impressions": 535714
  }...... etc.
]; 

这是我的尝试:

var linq = Enumerable.From(data2);
data2 = linq.GroupBy(function (x) {
  return x.date;
}).Select(function (x) {
  return {
    date: x.Key(),
    impressions: x.Sum(function (y) {
      return y.impressions | 0;
    })
  };
}).ToArray();

但是,它无法正常工作,因为 GroupBy 前后所有 impressions 的总和接近但不相同。

在这种情况下,在 linq.js 中使用 group by 的正确方法是什么?

这是 an example in fiddle这里有完整的数据集,它会在使用 GroupBy 之前和之后提醒总展示次数。

最佳答案

解决方案

您可以通过将回调作为第三个参数传递来完成此操作,如下所示:

var grouped = Enumerable.from(dataArray).groupBy("$.person", null, <i>(key, g) => {
  return { 
      person: key, 
      likes: <b>g.sum("$.likes | 0")</b>
 }
}</i>).toArray()

说明

groupBy 中,第三个参数允许您在发出之前修改结果:

GroupBy > ResultSelector

在 JS 中,bitwise or operator (单个管道 |)如果存在则返回第一个值,否则返回第二个。没有它,尝试将未定义的值与真实值相加,​​将返回 NaN

undefined + 1 // NaN

没有| 0,结果将如下所示:

NaN

此示例使用速记语法,但如果您希望在任何时候看到带有美元符号的字符串,您可以将其替换为像这样的 lambda 语法(它们都做同样的事情):

// Shorthand
.Select("<b>$</b>.impressions")
// Lambda
.Select(<b>function (x) { return x</b>.impressions })

Stack Snippets 工作演示:

var dataArray = [
  {
    person: "james",
    likes: 100
  }, 
  {
    person: "james",
    likes: 250
  }, 
  {
    person: "kyle",
    likes: 300
  }, 
  {
    person: "kyle"
    //,likes: 450
  }
];

var grouped = Enumerable.from(dataArray).groupBy("$.person", null, (key, g) => {
  return { person: key, likes: g.sum("$.likes | 0") }
}).toArray()

console.log(grouped);
<script src="https://unpkg.com/linq@3.2.0/linq.js"></script>

进一步阅读:

关于javascript - linq.js 按 javascript 中的对象数组分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23705077/

相关文章:

c# - 如何与字符串数组和字符串进行比较

c# - Linq DataContext SubmitChanges InvalidOperationException from ZombieCheck

c# - 我可以在 LINQ 中使用后置条件语句吗?

javascript - Angular 1.5.8 组件与 typescript (ecma6) 和 (ecma5) 配置不同

php - 使用 ajax 将 javascript 变量传递给 php,结果不显示任何内容

javascript - 用于动态改变高度的 AngularJS Masonry

javascript - linq.js 返回值(默认)FirstOrDefault

javascript - linq js中的多级分组

javascript - Linq.Js Group By 计数

javascript - Node.js - 重复 require ('path'/'module' ) 语句