Группировка с уменьшением в JS - PullRequest
0 голосов
/ 23 сентября 2018

Можно ли сгруппировать их по стране, используя метод array.reduce?Любые советы приветствуются.

const table = { 
  0: {
    firstName: 'Mark',
    lastName: 'Spencer',
    adress: {
      Country: 'England',
      Town:    'London',
      Street: 'Old street',
      Postcode: 'W2 1RB'
    }
  },
  1: {
    firstName: 'Franz',
    lastName: 'Muller',
    adress: {
      Country: 'Germany',
      Town: 'Berlin'
      Street: 'Wilhelmstrasse',
      Postcode: '10115 - 14199'
    }
  },
  2: {
    firstName: 'William',
    lastName: 'Davies',
    adress: {
      Country: 'England',
      Town:    'Liverpool'
      Street: 'New Street',
      Postcode: 'l1 0au'
    }

Как правильно отсортировать их, используя только этот метод?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Вы можете использовать Object.values, чтобы получить значения вашего объекта в виде массива.Ключи от вашего стола, кажется, не имеют смысла;они просто индексы.Это значения, которые вы хотите сгруппировать: использование Object.values проясняет это.

Получив массив, вы можете использовать Array.prototype.reduce.Я завернул groupBy в многократно используемую функцию, которая использует reduce внутри.

const table = { 0: { firstName: 'Mark', lastName: 'Spencer', address: { Country: 'England', Town: 'London', Street: 'Old street', Postcode: 'W2 1RB' } }, 1: { firstName: 'Franz', lastName: 'Muller', address: { Country: 'Germany', Town: 'Berlin', Street: 'Wilhelmstrasse', Postcode: '10115 - 14199' } }, 2: { firstName: 'William', lastName: 'Davies', address: { Country: 'England', Town: 'Liverpool', Street: 'New Street', Postcode: 'l1 0au' } } };

const groupBy = (getId, array) => 
  array.reduce(
    (groups, x) => {
      const k = getId(x);
      if (!groups[k]) groups[k] = [];
      groups[k].push(x);
      return groups;
    },
    {}
  );
  
  
console.log(
  groupBy(
    person => person.address.Country,
    Object.values(table)
  )
)
    
0 голосов
/ 23 сентября 2018

Вы можете преобразовать ваш объект с ключами, такими как индексы с Object.assign, в массив и затем уменьшить его.

var data = { 0: { firstName: 'Mark', lastName: 'Spencer', address: { Country: 'England', Town: 'London', Street: 'Old street', Postcode: 'W2 1RB' } }, 1: { firstName: 'Franz', lastName: 'Muller', address: { Country: 'Germany', Town: 'Berlin', Street: 'Wilhelmstrasse', Postcode: '10115 - 14199' } }, 2: { firstName: 'William', lastName: 'Davies', address: { Country: 'England', Town: 'Liverpool', Street: 'New Street', Postcode: 'l1 0au' } } },
    grouped = Object
        .assign([], data)
        .reduce((r, o) => {
            var key = o.address.Country;
            (r[key] = r[key] || []).push(o);
            return r;
        }, Object.create(null));
    
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...