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

use*_*721 5 javascript linq linq.js

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

data2 = [{
    "date": 1399298400.0,
    "adId": 1057946139383,
    "impressions": 1000000
  }, {
    "date": 1399298400.0,
    "adId": 3301784671323,
    "impressions": 535714
  }...... etc.
]; 
Run Code Online (Sandbox Code Playgroud)

这是我的尝试:

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();
Run Code Online (Sandbox Code Playgroud)

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

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

这里有一个完整数据集的示例,它提醒使用之前和之后的总展示次数GroupBy.

Kyl*_*Mit 8

要访问groupBy属性|,您必须在方法组内.

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

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

NaN等式的一部分是一种消毒数据的方法.在下面的示例中,其中一个数据数组元素意外地没有impressions属性.当JavaScript对这个组中的所有项进行求和时,它会一直突然发现它遇到一个完全缺失的值,此时整个聚合的结果将是可怕的| 0:

为NaN

pipe(groupBy)运算符在JS中的作用是返回第一个值(如果存在),否则返回第二个值.因此,该表达式可以防止丢失属性.

Stack Snippets的工作演示:

undefined + 1 // NaN
Run Code Online (Sandbox Code Playgroud)
// Shorthand
.Select("$.impressions")
// Lambda
.Select(function (x) { return x.impressions })
Run Code Online (Sandbox Code Playgroud)

注意:这使用了简写语法,但是如果您喜欢在任何时候看到带有美元符号的字符串,您可以将其替换为这样的lambda语法(两者都做同样的事情):

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);
Run Code Online (Sandbox Code Playgroud)

此外,您可以通过总和找到有关linqjs组的更多信息