Ищем группировать массив по значениям в подмассиве - PullRequest
0 голосов
/ 14 ноября 2018

Попытка разобрать один набор данных, который имеет кучу одинаковых «вторичных идентификаторов», таким образом, чтобы я мог сгруппировать и перебрать их вместе.

На английском я пытаюсь это сделать msgstr "выбрать уникальную группу из всех элементов, для которых значение поля уникально"

'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 голосов
/ 19 февраля 2019

также можно сделать с помощью 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))
0 голосов
/ 14 ноября 2018

Если вас интересует функциональный подход, вот решение с использованием 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>
0 голосов
/ 14 ноября 2018

Я думаю, что самый простой способ добиться этого - использовать метод Array.prototype.reduce для создания объекта, который сопоставляет уникальные Group имена с массивами, которые содержат Name s.Вы можете указать пустой литерал объекта в качестве начального аккумулятора 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);
0 голосов
/ 14 ноября 2018

Для этого я бы использовал 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, чтобы вы могли видеть, как это работает.

Надеюсь, это поможет!

0 голосов
/ 14 ноября 2018

Вы также можете 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);
0 голосов
/ 14 ноября 2018

может сделать что-то вроде ..

const map = {};
data.forEach( d => {
    if( map[d.Group] ) {
        map[d.Group].push(d.Name);
    } else {
        map[d.Group] = [d.Name];
    }
})
console.log(map)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...