这是对以下问题的跟进问题:

Javascript Equivalent to C# LINQ Select

我们正在使用Angular 2 + TypeScript:

我有一个对象数组。数组中的每个对象都包含一个名为“StudentType”的属性。

我需要运行一个C#LINQ样式查询,该查询提取数组中的StudentType列表以及具有该特定类型的数组成员的数量。

虽然我可以做一个老式的循环,但是我想知道是否有更好的方法,例如C#LINQ GroupBy提供的功能。

由于我们使用的是Angular 2,因此项目负责人不允许使用JQuery。

最佳答案

我只是组成了一些用于测试的StudentType值,但是您可以使用Array.prototype.reduce()遍历输入数组的每个元素,并添加或操作累加器对象的属性。

let arr = [{
    studentType: 'freshman'
  },
  {
    studentType: 'senior'
  },
  {
    studentType: 'sophomore'
  },
  {
    studentType: 'freshman'
  },
  {
    studentType: 'junior'
  },
  {
    studentType: 'senior'
  },
  {
    studentType: 'sophomore'
  },
  {
    studentType: 'freshman'
  },
  {
    studentType: 'sophomore'
  },
  {
    studentType: 'freshman'
  }
];

let result = arr.reduce((prev, curr) => {
  isNaN(prev[curr.studentType]) ? prev[curr.studentType] = 1 : prev[curr.studentType]++;
  return prev;
}, {});

console.log(result);

10-04 21:02