Объединить массив объектов по атрибуту

1

Привет, я пытаюсь объединить массив объектов, и конечный результат должен быть массивом объекта с одним из атрибутов attr, а другой - массивом со всеми значениями из второго attr в оригинале

Массив У меня:

let arr = [
    { 
        name: 'cdd_register', 
        levels: 'read' 
    }, { 
        name: 'cdd_register', 
        levels: 'write' 
    }, { 
        name: 'annual_reports', 
        levels: 'write' 
    }
];

И я ожидаю:

let result = [
    { 
        name: 'cdd_register', 
        levels: ['read', 'write']
    }, { 
        name: 'annual_reports', 
        levels: 'write' 
    }
];

У меня есть ответ от бэкэнд

data: [{
    id:1
    label: "Administrator"
    name: "admin"
    permissions:{
        data: [{
            id: 4, 
            name: "cdd_register.read", 
            label: "Read access on CDD Register module"
        }, {
            id: 6, 
            name: "cdd_register.write", 
            label: "Write access on CDD Register module"
        }, {
            id: 7, 
            name: "annual_reports.write", 
            label: "Write access on Annual Reports module"
        }]
    }
}]

И после этого

getModules(roles) {
    let modules = [];

    _.forEach(roles, role => {
        _.forEach(role.permissions.data, permission => {
            modules.push(permission);
        })
    });

    return _.uniqBy(modules, 'id').map(module => {
        let moduleArray = module.name.split('.');
            return {
                 name: moduleArray[0],
                 levels: moduleArray[1]
            }
        });
    }
}

У меня есть результат, как сейчас, но не могу понять, как это сделать.

Благодарю.

  • 1
    Здравствуй. Добро пожаловать в ТАК. Вам нужно добавить код, над которым вы работали, к вашему вопросу в виде минимального воспроизводимого примера .
  • 0
    Извините, обновлено с примером кода и ответом с сервера @Andy
Теги:
lodash

1 ответ

0
Лучший ответ

Это можно сделать разными способами. Одним из возможных способов может быть использование некоторой функциональной магии

let arr = [{
  name: 'cdd_register',
  levels: 'read'
}, {
  name: 'cdd_register',
  levels: 'write'
}, {
  name: 'annual_reports',
  levels: 'write'
}];

let result = arr.reduce((acc, x) => {
  const found = acc.find(y => (x.name == y.name));
  if (!found) {
    acc.push({
      name: x.name,
      levels: arr
        .filter(y => (x.name == y.name))
        .map(z => (z.levels))
    });
  }
  return acc;
}, [])

console.log(result)
  • 0
    спасибо @ncardeli, это решение, которое я искал :)
  • 0
    Рад помочь и добро пожаловать в Stack Overflow. Если этот или другой ответ решил вашу проблему, отметьте его как принятый.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню