Извлекать глубоко вложенные свойства в массив уникальных значений - PullRequest
0 голосов
/ 31 марта 2020

Учитывая, что ниже JSON является моим объектом, как я могу извлечь userId и роли, хранить их в отдельных массивах соответственно, без повторяющихся значений.

let rosterInfo = 
    [
        {
           "shiftName": "A",
            "userDetail": [
            {
              "userId": 'Mary',
              "roles": ['Operator', 'Supervisor']
            },
            {
              "userId": 'John',
              "roles": ['Supervisor', Maintenance Technician]
            }
          ]
        },
        {
           "shiftName": "B",
          "userDetail": [
            {
              "userId": 'Crusier',
              "roles": ['Operator', 'Supervisor']
            },
            {
              "userId": 'Philips',
              "roles": ['Operator', 'Supervisor']
            }
          ]
        },
        {
           "shiftName": "C",
             "userDetail": [
            {
              "userId": 'Heath',
              "roles": ['Operator', 'Supervisor']
            },
            {
              "userId": 'Daniel',
              "roles": ['Operator', 'Supervisor']
            }
          ]
        }
    ];

Конечный массив ролей должен быть: ['Оператор,' Супервайзер ',' Техник по обслуживанию '] Окончательный массив userId должен быть: [' Heath ',' Daniel ',' Philips ',' John ',' Mary ',' Crusier ']

Примечание: я использовал циклы ForEach и For, но это не будет идеальным решением. Вот мое решение с использованием петель.

  rosterInfo.forEach(rosterItem => {
  for (let userItem of rosterItem['userDetail']) {
    userItem['roles'].forEach(role => {
      this.rolesInAShift.indexOf(role) > -1
        ? ''
        : this.rolesInAShift.push(role);
    });
  }
});

В дополнение к этому, если вообще из указанного выше объекта, если вообще я хочу отфильтровать вышеуказанный объект с именем «Джон» и роли «Супервизор», то финал будет чем-то такого рода.

rosterInfo = 
    [
        {
           "shiftName": "A",
            "userDetail": [
            {
              "userId": 'John',
              "roles": ['Supervisor', 'Maintenance Technician']
            }

          ]
        },
        {
           "shiftName": "B",
          "userDetail": [

          ]
        },
        {
           "shiftName": "C",
             "userDetail": [

          ]
        }
    ]

Мне удалось добиться этого с помощью циклов, однако, используя нижеприведенную логику c, не получается то, что я хочу.

 someVar = rosterInfo.map(element => {
        return {
          ...element,
          userDetail: element.userDetail.filter(
            subElement =>
              subElement.roles.indexOf('Supervisor') > -1 &&
              subElement.userId.indexOf('Rajasekhar')
          )
        };
      });

Ответы [ 2 ]

3 голосов
/ 31 марта 2020

Вы можете использовать Array.prototype.map() вместе с Set() для удаления дубликатов:

const rosterInfo = 
    [{"shiftName":"A","userDetail":[{"userId":'Mary',"roles":['Operator','Supervisor']},{"userId":'John',"roles":['Supervisor','Maintenance Technician']}]},{"shiftName":"B","userDetail":[{"userId":'Crusier',"roles":['Operator','Supervisor']},{"userId":'Philips',"roles":['Operator','Supervisor']}]},{"shiftName":"C","userDetail":[{"userId":'Heath',"roles":['Operator','Supervisor']},{"userId":'Daniel',"roles":['Operator','Supervisor']}]}],
    
    userIds = [...new Set(
      rosterInfo
        .map(({userDetail}) =>
          userDetail.map(({userId}) => userId))
        .flat()
    )],
    
    roles = [...new Set(
      rosterInfo
        .map(({userDetail}) => 
          userDetail.map(({roles}) => roles))
        .flat(2)
    )]
    
console.log(userIds)
console.log(roles)
.as-console-wrapper{min-height:100%;}
1 голос
/ 31 марта 2020

Использование reduce и Set может быть сделано легко. Уменьшите до l oop, установите для уникального. Пожалуйста, проверьте образец.

let rosterInfo = [
  {
    shiftName: "A",
    userDetail: [
      { userId: "Mary", roles: ["Operator", "Supervisor"] },
      { userId: "John", roles: ["Supervisor", "Maintenance Technician"] }
    ]
  },
  {
    shiftName: "B",
    userDetail: [
      { userId: "Crusier", roles: ["Operator", "Supervisor"] },
      { userId: "Philips", roles: ["Operator", "Supervisor"] }
    ]
  },
  {
    shiftName: "C",
    userDetail: [
      { userId: "Heath", roles: ["Operator", "Supervisor"] },
      { userId: "Daniel", roles: ["Operator", "Supervisor"] }
    ]
  }
];
const [roles, names] = rosterInfo.reduce(
  ([roles, names], i) => {
    i.userDetail.forEach(x => {
      roles = roles.concat(x.roles);
      names.push(x.userId);
    });
    return [roles, names];
  },
  [[], []]
);
console.log(Array.from(new Set(roles)), Array.from(new Set(names)));
...