@Pavel_Tkachenko
Да, я преступник. Моё преступление — любопытство

Удаление объекта из массива в NodeJS или неправленый скрипт?

Суть проблемы такова, что скрипт работает немного не правильно... Не могу самостоятельно разобраться.
Есть массив объектов :
var routes = [ 
    { path: '/login', methods: [ 'GET' ] },
    { path: '/login', methods: [ 'POST' ] },
    { path: '/admin', methods: [ 'GET' ] },
    { path: '/admin', methods: [ 'POST' ] },
    { path: '/admin', methods: [ 'PUT' ] },
    { path: '/admin/mylogin', methods: [ 'GET' ] },
    { path: '/admin/mylogin', methods: [ 'POST' ] },
    { path: '/admin/mylogin/:user', methods: [ 'GET' ] },
    { path: '/admin/mylogin/:user', methods: [ 'POST' ] },
    { path: '/client', methods: [ 'GET' ] },
    { path: '/client', methods: [ 'POST' ] },
    { path: '/client/123', methods: [ 'GET' ] },
    { path: '/client/123', methods: [ 'POST' ] },
    { path: '/client/123', methods: [ 'DELETE' ] },
    { path: '/client/123', methods: [ 'PUT' ] },
    { path: '/', methods: [ 'GET' ] }
];

Нужно выбрать все совпадения path и запушить из совпавших в искомый methods, и удалить совпавший
Скрипт :
routes.forEach((element, i) => {
    j = 0;
    while(j < routes.length) {
        if (routes[j].path === element.path && routes[j].methods !== element.methods) {
            element.methods.push(routes[j].methods[0]);
            routes.splice(j,1)
        }
        j++
    }
});

В итоге у меня там где 4 и более совпавших элемента примерно такое:
{ path: '/client/123', methods: [ 'POST', 'GET', 'DELETE' ] },
{ path: '/client/123', methods: [ 'PUT' ] }

А должно быть :
{ path: '/client/123', methods: [ 'POST', 'GET', 'DELETE', 'PUT' ] }

Пробовал и delete routes[j], но там удаление срабатывает вообще раньше чем выполняется условие и NodeJS ругается, что routes[j].path не определено.
  • Вопрос задан
  • 209 просмотров
Решения вопроса 1
rockon404
@rockon404
Frontend Developer
const groupedRoutes = Object.values(routes.reduce((map, { path, methods }) => {
  map[path] =  map[path] ?
   { path, methods: [ ...map[path].methods, ...methods ] } :
   { path, methods };

  return map;
},{}));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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