Объедините несколько объектов со странной структурой в один - PullRequest
0 голосов
/ 14 мая 2019

У меня есть массив с несколькими объектами, которые я пытаюсь объединить в один отдельный объект

[
  { user: { '563D': { pId: '12', seasion: '120', value: true } } },
  { user: { '563D': { pId: '11', seasion: '120', value: false } } },
  ...
] 
  • pId уникален
  • seasion являетсято же самое для каждого объекта (почти никогда не меняется)
  • value может быть чем угодно

Я хочу иметь что-то вроде этого:

{
  id: '563D',
  seasion: '120',
  types: {
    12: // pId
    {
      value: true
    },
    11:
    {
      value: false
    }
  }
}

Я пыталсяиспользуйте сокращение и forEach, но я не смог достичь своих целей из-за плохого понимания этих двух методов.

EDIT :

забыл оввод нескольких пользователей, извините

[
  {
    users: {
      '563D': [Object],
      '4b07': [Object]
    }
  },
  {
    users: {
      '563D': [Object],
      '4b07': [Object]
    }
  },
  {
   users: {
      '563D': [Object],
      '4b07': [Object]
    }
  }
]

1 Ответ

1 голос
/ 14 мая 2019

Вы можете использовать reduce и деструктурирование , чтобы сгруппировать объекты на основе первого ключа внутри user. Затем используйте Object.values(), чтобы получить массив значений каждой группы:

  • Получите user от каждого объекта, уничтожив параметр
  • Уничтожить первую запись из user, чтобы получить ключ (например, '563D') и вложенные свойства отдельно)
  • Используйте оператор ||, чтобы проверить, имеет ли аккумулятор уже id в качестве его свойства. Если да, используйте это. В противном случае присвойте новое значение с помощью { id, seasion, types: {} }. Для этого используются Сокращенные имена свойств .
  • Обновите types, указав pId в качестве ключа и { value } в качестве значения

const input = [{user:{'563D':{pId:'12',seasion:120,value:true}, '4b07':{pId:'12',seasion:120,value:true}}},{user:{'563D':{pId:'11',seasion:120,value:false},'4b07':{pId:'11',seasion:120,value:false}}}]

const output = input.reduce((r, { user }) => {
  for(const [id, { pId, seasion, value }] of Object.entries(user)) {
    r[id] = r[id] || { id, seasion, types: {} };
    r[id].types[pId] = { value };
  }
  return r;
}, {})

console.log(Object.values(output))

Если у вас есть только один уникальный id в массиве, вы можете упростить reduce до:

const input = [{user:{'563D':{pId:'12',seasion:120,value:true}}},{user:{'563D':{pId:'11',seasion:120,value:false}}}]

const output = input.reduce((r, { user }) => {
  const [id, { pId, seasion, value }] = Object.entries(user)[0];
  return { id, seasion, types: { ...r.types, [pId]: { value } } }
}, {})

console.log(output)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...