希望通过子数组中的值对数组进行分组

时间:2018-11-13 22:29:21

标签: javascript ecmascript-6 vuejs2

尝试解析一个具有一堆相同“ 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" ],
}

6 个答案:

答案 0 :(得分:1)

您还可以将数组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);

答案 1 :(得分: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 :(得分:0)

可以做类似的事情。

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

答案 3 :(得分:0)

我认为最简单的方法是使用Array.prototype.reduce方法创建一个对象,该对象将唯一的Group名称映射到包含Name的数组。您可以提供一个空的对象文字作为初始的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);

答案 4 :(得分:0)

如果您对功能性方法感兴趣,这里是使用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>

答案 5 :(得分:0)

也可以使用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))