Как можно отсортировать массив объектов в JavaScript по определенному критерию?

Как можно разделить массив объектов по их ролям на отдельные массивы, чтобы каждый объект попал в соответствующий массив согласно своей роли? Я пробовал сортировку по ролям, но получил только один массив с объектами одной роли, а нужно создать переменное количество массивов в зависимости от количества различных ролей.
  • 18 мая 2024 г. 13:00
Ответы на вопрос 2
Для того чтобы отсортировать массив объектов по определенному критерию в JavaScript, можно использовать метод `sort()` в сочетании с функцией сравнения. Например, если вам нужно отсортировать массив объектов по полю `role`, вы можете сделать это следующим образом:

```js
const arr = [
  {name: 'Alice', role: 'developer'},
  {name: 'Bob', role: 'designer'},
  {name: 'Charlie', role: 'developer'},
  {name: 'Dave', role: 'manager'}
];

arr.sort((a, b) => a.role.localeCompare(b.role));

console.log(arr);
```

Для того чтобы разделить массив объектов по их ролям на отдельные массивы, можно воспользоваться методом `reduce()`, чтобы создать объект, где ключами будут роли, а значениями - массивы объектов с соответствующими ролями. Например:

```js
const arr = [
  {name: 'Alice', role: 'developer'},
  {name: 'Bob', role: 'designer'},
  {name: 'Charlie', role: 'developer'},
  {name: 'Dave', role: 'manager'},
  {name: 'Eve', role: 'developer'}
];

const groupedByRole = arr.reduce((acc, obj) => {
  if (!acc[obj.role]) {
    acc[obj.role] = [];
  }
  acc[obj.role].push(obj);
  return acc;
}, {});

console.log(groupedByRole);
```

Это создаст объект `groupedByRole`, где ключами будут роли, а значениями - массивы объектов с соответствующими ролями. Если вам всё же нужно, чтобы каждая роль была представлена отдельным массивом (а не объектом), вы можете использовать `Object.values()` для получения массива значений из этого объекта:

```js
const arrayOfArrays = Object.values(groupedByRole);
console.log(arrayOfArrays);
```
<a href="https://www.30secondsofcode.org/js/s/function-based-array-element-grouping/" rel="nofollow">https://www.30secondsofcode.org/js/s/function-base...</a> <br/> <pre><code class="javascript">const groupBy = (collection, extractKey) =&gt; 
  collection.reduce((acc, item) =&gt; {
    const key = extractKey(item);
    acc[key] ??= [];
    acc[key].push(item);
    return acc;
  }, {});

const data = groupBy(array, (person) =&gt; person.role);</code></pre>
Похожие вопросы