【问题标题】:Group and count values in an array into an object将数组中的值分组并计数到对象中
【发布时间】:2021-06-05 21:16:11
【问题描述】:

我有以下数组形式的信息

0: { first: "sea",      second: "deniz",   languageId: "English-Turkish"}
1: { first: "play",     second: "oynamak", languageId: "English-Turkish"}
2: { first: "swim",     second: "yuzmek",  languageId: "English-Turkish"}
3: { first: "foo",      second: "bar",     languageId: "German-Russian"}
4: { first: "computer", second: "l'ordi",  languageId: "English-French"}

我需要将它们按languageId 分组并计算属于这些组的项目。 为此,我还有以下对象,

export class stats{
    name: String;
    count: number;
}

最后我需要以下信息;

0: { name: "English-Turkish",  count: 3 }
1: { name: "German-Russian",   count: 1 }
2: { name: "English-French",   count: 1 }

Array.reduce 函数对我来说似乎是一个很好的方法,但无法弄清楚。我该如何实现?

【问题讨论】:

    标签: javascript arrays typescript sorting group-by


    【解决方案1】:

    遗憾的是,array.reduce 可能不是解决此问题的正确工具。

    但这就是你要找的吗?如果你需要经常使用它,你可以把它变成一个函数。

    let items = [
      { first: "sea",      second: "deniz",   languageId: "English-Turkish"},
      { first: "play",     second: "oynamak", languageId: "English-Turkish"},
      { first: "swim",     second: "yuzmek",  languageId: "English-Turkish"},
      { first: "foo",      second: "bar",     languageId: "German-Russian"},
      { first: "computer", second: "l'ordi",  languageId: "English-French"},
    ];
    let grouped = {};
    for (let item of items) {
      let { languageId } = item;
      if (!(languageId in grouped)) {
        grouped[languageId] = [];
      }
      grouped[languageId].push(item);
    }
    let counts = Object.entries(grouped).map(([name, arr]) => ({ name, count: arr.length }));
    console.log(counts);
    

    这有groupedcounts,所以如果你需要将它们全部组合在一起;它也有。

    【讨论】:

      【解决方案2】:

      Array.reduce 函数对我来说似乎是一个很好的方法,但是 想不通。我该如何实现?

      您可以使用.reduce() 以更优雅的方式获得您的期望值,如下所示:

      const items = [
        { first: "sea",      second: "deniz",   languageId: "English-Turkish"},
        { first: "play",     second: "oynamak", languageId: "English-Turkish"},
        { first: "swim",     second: "yuzmek",  languageId: "English-Turkish"},
        { first: "foo",      second: "bar",     languageId: "German-Russian"},
        { first: "computer", second: "l'ordi",  languageId: "English-French"},
      ];
      
      const result = items.reduce((acc, {languageId}) => 
      {
        acc[languageId] = acc[languageId] || {name: languageId, count: 0};
        // The more elegant way: acc[languageId] ??= {name: languageId, count: 0};
        acc[languageId]['count'] += 1;
        
        return acc;
      }, {});
      
      console.log(Object.values(result));

      reduce() 方法在 数组的每个元素,产生一个输出值。

      【讨论】:

        猜你喜欢
        • 2020-11-13
        • 1970-01-01
        • 2010-11-10
        • 2020-09-16
        • 1970-01-01
        • 1970-01-01
        • 2018-10-14
        • 2018-11-25
        • 2018-04-30
        相关资源
        最近更新 更多