【问题标题】:Looking to group array by values in the sub array希望按子数组中的值对数组进行分组
【发布时间】:2018-11-13 22:29:21
【问题描述】:

尝试解析一个数据集,其中包含一堆相同的“secondaryID”,以便我可以将它们分组并一起迭代。

用英语我想做的是 "选择字段值唯一的所有项目的唯一组"

'use strict';

const data = [{
    Group: 'A',
    Name: 'SD'
}, {
    Group: 'B',
    Name: 'FI'
}, {
    Group: 'A',
    Name: 'MM'
}, {
    Group: 'B',
    Name: 'CO'
}];

let unique = [...new Set(data.map(item => item.Group))];
console.log(unique);

这给出了 ["A"],["B"]

但我正在寻找的是

{
  A: [ "SD","MM" ],
  B: [ "FI","CO" ],
}

【问题讨论】:

    标签: javascript ecmascript-6 vuejs2


    【解决方案1】:

    为此,我会使用array.reduce 而不是array.map,因为您实际上希望返回的是一个 new 值,而不是修改后的数组,reduce 方法非常适合您希望从字面上将数组减少为单个输出值,在您的情况下是唯一组的对象。也许尝试这样的事情:

    let unique = data.reduce((acc, { Group, Name }) => {
      if (!(acc.hasOwnProperty(Group))) {
        acc[Group] = [Name];
      } else {
        acc[Group].push(Name);
      }; 
      return acc;
    }, {});
    

    我还为此添加了一支笔:https://codepen.io/anon/pen/BGpgdz?editors=1011,因此您可以看到它的工作原理。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      你也可以reduce你的数组到分组对象(由Group值键控):

      const data = [{
        Group: 'A',
        Name: 'SD'
      }, {
        Group: 'B',
        Name: 'FI'
      }, {
        Group: 'A',
        Name: 'MM'
      }, {
        Group: 'B',
        Name: 'CO'
      }];
      
      const grouped = data.reduce((a, {Group, Name}) => {
        if (!(Group in a)) a[Group] = [Name];
        else a[Group].push(Name);
        return a;
      }, {});
      
      console.log(grouped);

      【讨论】:

        【解决方案3】:

        可以做类似的事情..

        const map = {};
        data.forEach( d => {
            if( map[d.Group] ) {
                map[d.Group].push(d.Name);
            } else {
                map[d.Group] = [d.Name];
            }
        })
        console.log(map)
        

        【讨论】:

          【解决方案4】:

          我认为实现这一点的最简单方法是使用Array.prototype.reduce 方法创建一个对象,该对象将唯一的Group 名称映射到包含Names 的数组。您可以提供一个空对象文字作为您的初始 reduce 累加器:

          const data = [{
            Group: 'A',
            Name: 'SD'
          }, {
            Group: 'B',
            Name: 'FI'
          }, {
            Group: 'A',
            Name: 'MM'
          }, {
            Group: 'B',
            Name: 'CO'
          }];
          
          var namesByGroup = data.reduce((map, el) => {
            map[el.Group] ? map[el.Group].push(el.Name) : map[el.Group] = [el.Name];
            return map;
          }, {});
          
          console.log(namesByGroup);

          【讨论】:

            【解决方案5】:

            如果您对函数式方法感兴趣,这里有一个使用 Ramda 的解决方案:

            const group =
              R.pipe(
                R.groupBy(R.prop('Group')),
                R.map(R.map(R.prop('Name'))));
            
            console.log(
              group([
                {Group: 'A', Name: 'SD'},
                {Group: 'B', Name: 'FI'},
                {Group: 'A', Name: 'MM'},
                {Group: 'B', Name: 'CO'}])
            );
            <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>

            【讨论】:

              【解决方案6】:

              也可以使用 forEach 完成

              const data = [{
              	Group: 'A',
              	Name: 'SD'
              }, {
              	Group: 'B',
              	Name: 'FI'
              }, {
              	Group: 'A',
              	Name: 'MM'
              }, {
              	Group: 'B',
              	Name: 'CO'
              }];
              
              const somefunction = (data) => {
              let arr = {}
              data.forEach( ({Group, Name}) => {
                Group in arr ?  arr[Group].push(Name) : arr[Group] = [Name]
              })
              return arr;
              }
              
              console.log(somefunction(data))

              【讨论】:

                猜你喜欢
                • 2011-11-26
                • 2013-02-19
                • 1970-01-01
                • 2012-09-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-10-10
                相关资源
                最近更新 更多