Как сгруппировать данные?

Есть массив объектов. Как сгруппировать последовательности так сказать. Если следующий элемент по Id на 1 больше то последовательность эта же. Если на 2 больше - то создается новый массив и этот и следующие элементы уже пушатся туда и тд. Если Id соседей больше Id элемента на 2 - то он создаст массив с самим собой и ключем, равным его Id. В остальных случаях ключ будет равен первому и последнему Id элементов массива.

Можно использовать Lodash если знаете хитрый метод или связку. До меня пока что не доходит.

const data = [
    {id: 1},
    {id: 2},
    {id: 3},
    {id: 4},
    {id: 7},
    {id: 9},
    {id: 10},
    {id: 12},
    {id: 14},
    {id: 15},
    {id: 16}];

const result = [
    "1-4": [
        {id: 1},
        {id: 2},
        {id: 3},
        {id: 4}],
    "7": [
        {id: 7}],
    "9-10": [
        {id: 9},
        {id: 10}],
    "12": [
        {id: 12}],
    "14-16": [
        {id: 14},
        {id: 15},
        {id: 16}]];
  • Вопрос задан
  • 390 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const grouped = data
  .reduce((acc, n, i, a) => {
    if (i && n.id === a[i - 1].id + 1) {
      acc[acc.length - 1][1][1] = n.id;
    } else {
      acc.push([ [], [ n.id ] ]);
    }
    acc[acc.length - 1][0].push(n);
    return acc;
  }, [])
  .reduce((acc, n) => {
    acc[n[1].join('-')] = n[0];
    return acc;
  }, {});
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
SnaIP
@SnaIP
Front-end разработчик
reduce
можно заюзать как вариант
Ответ написан
Комментировать
topus009
@topus009 Автор вопроса
мне еще на стэкОверфлоу такой вариант написали

const result = data.reduce(
  ([result,nextNum],item)=>{
    if(nextNum===undefined){
      nextNum=item.id;
      result.push([]);
    }
    if(!(nextNum===item.id)){
      result.push([]);
    }
    result[result.length-1].push(item);
    return [result,item.id+1];
  },
  [[],undefined]
);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы