Создайте карту для пользователя 'userId' в качестве ключа, и все сообщения объединятся в массив - PullRequest
0 голосов
/ 31 января 2019

Я знаю, что название может показаться странным, но я застрял на час, в основном, как поместить их в массив.Это мой монго-вывод -

userFavPost:

 [ { post: '2920', user: '5a1d2f59cf81657f613b0683' },
   { post: '2920', user: '5a057915c31eb5601da9b75f' },
   { post: '2922', user: '5a057915c31eb5601da9b75f' },
   { post: '2998', user: '5a057915c31eb5601da9b75f' } ]

Я хочу создать карту, чтобы я получал такие данные -

{
  '5a1d2f59cf81657f613b0683' => {
    post: [2920],
    user: '5a1d2f59cf81657f613b0683'
  },
  '5a057915c31eb5601da9b75f' => {
    post: [2920, 2922, 2998],
    user: '5a057915c31eb5601da9b75f'
  }
}

Iзнаю, что это вопрос новичка, но я в замешательстве!

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Еще один дубль, который выдает форму, указанную в оригинальном сообщении:

const userFavPost =
 [ { post: '2920', user: '5a1d2f59cf81657f613b0683' },
   { post: '2920', user: '5a057915c31eb5601da9b75f' },
   { post: '2922', user: '5a057915c31eb5601da9b75f' },
   { post: '2998', user: '5a057915c31eb5601da9b75f' } ];

const postMap = userFavPost.reduce((users, entry) => ({
  ...users,
  [entry.user]: {
    ...users[entry.user],
    user: entry.user,
    post: [
      ...(users[entry.user] && users[entry.user].post || []),
      entry.post
    ]
  }
}), {});

/* { '5a1d2f59cf81657f613b0683': 
       { user: '5a1d2f59cf81657f613b0683', post: [ '2920' ] },
     '5a057915c31eb5601da9b75f':
       { user: '5a057915c31eb5601da9b75f', post: [ '2920', '2922', '2998' ] } 
   } */
0 голосов
/ 31 января 2019

Вы можете использовать как простую reduce с такой деструктурой:

const posts= [{post:'2920',user:'5a1d2f59cf81657f613b0683'},{post:'2920',user:'5a057915c31eb5601da9b75f'},{post:'2922',user:'5a057915c31eb5601da9b75f'},{post:'2998',user:'5a057915c31eb5601da9b75f'}]
   
const merged = posts.reduce((acc, {user,post}) => {
    // check if user already exists in the accumulator else create
    acc[user] = acc[user] || {user, post:[]} 
    acc[user]["post"].push(post)
    return acc
  }, {});
  
console.log(merged)

Вы можете сделать все это в одну строку следующим образом:

const posts= [{post:'2920',user:'5a1d2f59cf81657f613b0683'},{post:'2920',user:'5a057915c31eb5601da9b75f'},{post:'2922',user:'5a057915c31eb5601da9b75f'},{post:'2998',user:'5a057915c31eb5601da9b75f'}]
   
const merged = posts.reduce((acc, {user,post}) =>
  ((acc[user] = acc[user] || {user, post:[]})["post"].push(post), acc),{});
  
console.log(merged)
0 голосов
/ 31 января 2019

Используйте функцию array.reduce и в объекте-аккумуляторе проверьте, существует ли ключ, совпадающий с пользовательским значением.Если он существует, вставьте новое значение в массив, в противном случае создайте новый ключ по пользовательскому значению и вставьте значение сообщения в массив

let arr = [{
    post: '2920',
    user: '5a1d2f59cf81657f613b0683'
  },
  {
    post: '2920',
    user: '5a057915c31eb5601da9b75f'
  },
  {
    post: '2922',
    user: '5a057915c31eb5601da9b75f'
  },
  {
    post: '2998',
    user: '5a057915c31eb5601da9b75f'
  }
]

let newObj = arr.reduce(function(acc, curr) {
  if (acc.hasOwnProperty(curr.user)) {
    acc[curr.user].push(curr.post)
  } else {

    acc[curr.user] = [curr.post]

  }

  return acc;
}, {});


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