Как сгруппировать объекты в массив на основе общего свойства в массив массивов - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь сгруппировать объекты, имеющие одно и то же свойство. Я начинаю с массива объектов, и я хочу закончить массивом, который содержит несколько массивов, каждый из которых содержит объекты с одинаковым свойством.

Скажем, у меня есть этот массив объектов фильма, все ониимеют свойство year, и я хочу сгруппировать все фильмы с одинаковым свойством year в их собственный массив и, наконец, объединить все эти массивы в один массив.

// This is the array I've got
const films = [
  {
    name='film 1',
    year='1992'
  },
  {
    name='film 2',
    year='1992'
  },
  {
    name='film 3',
    year='1995'
  },
  {
    name='film 4',
    year='1995'
  },
  {
    name='film 5',
    year='1995'
  },
  {
    name='film 6',
    year='1998'
  },
  {
    name='film 7',
    year='1998'
  },
]

// And this is the array I want to end up with
const filmsSorted = [
  [
    {
      name='film 1',
      year='1992'
    },
    {
      name='film 2',
      year='1992'
    },
  ]
  [
    {
      name='film 3',
      year='1995'
    },
    {
      name='film 4',
      year='1995'
    },
    {
      name='film 5',
      year='1995'
    },
  ]
  [
    {
      name='film 6',
      year='1998'
    },
    {
      name='film 7',
      year='1998'
    },
  ]
]

Имейте в виду, что я неу меня заранее есть свойство year, и он должен динамически работать с любым годом, который я получаю в исходном массиве.

Хотя здесь много вопросов о сортировке и фильтрации массивов, я не смог найти ответк этой конкретной проблеме. Я пытался использовать reduce() и filter() и их комбинацию, но я просто не могу разобраться с этим. Я нашел несколько возможных решений (преобразование его в объект и обратно в массив), но мне бы очень хотелось увидеть несколько разных способов решения этой проблемы, чтобы помочь мне лучше рассуждать об этом.

Ответы [ 3 ]

2 голосов
/ 27 октября 2019

Просто возьмите хеш-таблицу и сгруппируйте по year и возьмите значения из хеш-таблицы.

Бонус: отсортированный результат, потому что ключи объекта отсортированы, если ключи могут быть прочитаныв качестве индексов массива.

var films = [{ name: 'film 1', year: '1992' }, { name: 'film 2', year: '1992' }, { name: 'film 3', year: '1995' }, { name: 'film 4', year: '1995' }, { name: 'film 5', year: '1995' }, { name: 'film 6', year: '1998' }, { name: 'film 7', year: '1998' }],
    grouped = Object.values(
        films.reduce((r, o) => {
            (r[o.year] = r[o.year] || []).push(o);
            return r;
        }, {})
    );

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 27 октября 2019

Попробуйте это:

const films = [
  {
    name: 'film 1',
    year: '1992'
  },
  {
    name: 'film 2',
    year: '1992'
  },
  {
    name: 'film 3',
    year: '1995'
  },
  {
    name: 'film 4',
    year: '1995'
  },
  {
    name: 'film 5',
    year: '1995'
  },
  {
    name: 'film 6',
    year: '1998'
  },
  {
    name: 'film 7',
    year: '1998'
  }
]

const result = films.reduce((acc, curr) => {
  if (acc.some(e => e[0].year === curr.year)) acc.filter(e => e[0].year === curr.year)[0].push(curr)
  else acc.push([curr])
  
  return acc
}, [])

console.log(result)
0 голосов
/ 04 ноября 2019

Я нашел другой способ сделать это, я оставлю его здесь на случай, если это будет полезно для будущих читателей.

const films = [{ name: 'film 1', year: '1992' }, { name: 'film 2', year: '1992' }, { name: 'film 3', year: '1995' }, { name: 'film 4', year: '1995' }, { name: 'film 5', year: '1995' }, { name: 'film 6', year: '1998' }, { name: 'film 7', year: '1998' }]
let filmsSorted = []
let years = {}

films.forEach(film => {
    if (!years[film.year]) years[film.year] = []
    years[film.year].push(film)
})

filmsSorted = Object.values(years)

Это создает промежуточный объект, который имеет пары ключ / значение с общими свойствами(годы) и массивы всех объектов, содержащих это свойство. Затем мы можем просто создать массив значений и в итоге получим требуемую сортировку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...