@jeruthadam
Я крут

Как эффективно отфильтровать массив/объект с мега-вложенностью?

Такой кейс. Есть жесткие данные, типа

const array = [
  {
    aQueue: {
      active: [
        {
          name: 'A queue stuff', 
          data: {
            meta: {
              consumer: {
                id: 1
              }
            }
          }
        },
        {
          name: 'A queue stuff', 
          data: {
            meta: {
              consumer: {
                id: 2
              }
            }
          }
        },
        {
          name: 'A queue other stuff', 
          data: {
            meta: {
              consumer: {
                id: 1
              }
            }
          }
        }
      ],
      completed: [
        {
          name: 'A queue other stuff', 
          data: {
            meta: {
              consumer: {
                id: 2
              }
            }
          }
        }
      ]
    }
  },
  {
    bQueue: {
      active: [
        {
          name: 'B queue stuff', 
          data: {
            meta: {
              consumer: {
                id: 2
              }
            }
          }
        }
      ],
      completed: [
        {
          name: 'B queue other stuff', 
          data: {
            meta: {
              consumer: {
                id: 1
              }
            }
          }
        }
      ]
    }
  }
]


Как отфильтровать эту жесть по id: 1 с сохранением всей структуры, т.е. получить это:

const array = [
  {
    aQueue: {
      active: [
        {
          name: 'A queue stuff', 
          data: {
            meta: {
              consumer: {
                id: 1
              }
            }
          }
        },
        {
          name: 'A queue other stuff', 
          data: {
            meta: {
              consumer: {
                id: 1
              }
            }
          }
        }
      ],
      completed: []
    }
  },
  {
    bQueue: {
      active: [],
      completed: [
        {
          name: 'B queue other stuff', 
          data: {
            meta: {
              consumer: {
                id: 1
              }
            }
          }
        }
      ]
    }
  }
]


Если будет удобнее, то первый уровень можно сделать объектом, а не массивом, т.е. будет объект с ключами aQueue и bQueue, а дальше как есть.

Как наиболее эффективно выполнить это?
  • Вопрос задан
  • 80 просмотров
Решения вопроса 1
@StockholmSyndrome
const result = Object.entries(obj).reduce((acc, [key, {active, completed}]) => {
  const filter = ({data: {meta: {consumer: {id}}}}) => id === 1;
  acc[key] = {
    active: active.filter(filter), 
    completed: completed.filter(filter)
  };
  return acc;
}, {});

при такой структуре
{
  aQueue: ..., 
  bQueue: ...
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
28 нояб. 2024, в 14:14
200000 руб./за проект
28 нояб. 2024, в 14:12
300000 руб./за проект
28 нояб. 2024, в 14:06
1000 руб./в час