Как поместить объекты в массив в новый массив сортировки по дате? - PullRequest
3 голосов
/ 23 мая 2019

Я хочу использовать SectionList в React Native. Данные, которые необходимо отобразить в SectionList, выглядят так:

sections=[
 {
   date: 'May 24 2019', 
   data: [
     {
       id:1,
       msg: 'msg1',
       date: 'May 24 2019'
     },
     {
       id:2,
       msg: 'msg2',
       date: 'May 24 2019'
     },
 ]},
 {
   date: 'May 25 2019', 
   data: [
     {
       id:3,
       msg: 'msg1',
       date: 'May 25 2019'
     },
     {
       id:4,
       msg: 'msg2',
       date: 'May 25 2019'
     },
 ]},
];

Но данные, которые я получаю от сервера, выглядят так:

data:[
  {
       id:1,
       msg: 'msg1',
       date: 'May 24 2019'
  },
  {
       id:2,
       msg: 'msg2',
       date: 'May 24 2019'
  },
  {
       id:3,
       msg: 'msg1',
       date: 'May 25 2019'
  },
  {
       id:4,
       msg: 'msg1',
       date: 'May 25 2019'
  },
];

Итак, как мне преобразовать «данные» в «разделы»? Я ценю вашу помощь. И извините за мой английский.

Ответы [ 3 ]

2 голосов
/ 23 мая 2019

Вы можете использовать Array.reduce для создания фактической группировки, а затем извлечь значения через Object.values:

let data = [ { id:1, msg: 'msg1', date: 'May 24 2019' }, { id:2, msg: 'msg2', date: 'May 24 2019' }, { id:3, msg: 'msg1', date: 'May 25 2019' }, { id:4, msg: 'msg1', date: 'May 25 2019' }, ];

let result = data.reduce((r,{ date, ...other}) => {
  r[date] = r[date] || { date, data: [] }
  r[date].data = [...r[date].data, { date, ...other }]
  return r
}, {})

console.log(Object.values(result))
2 голосов
/ 23 мая 2019

Вы можете сделать это в следующих шагах:

  • Используйте reduce() для создания объекта, ключи которого будут иметь разные даты, а значения будут массивом, содержащим элементы
  • Затем получите значения этого объекта, используя Object.values()
  • Затем используйте map(), добавьте дополнительное свойство date и верните объект.

const data = [ { id:1, msg: 'msg1', date: 'May 24 2019' }, { id:2, msg: 'msg2', date: 'May 24 2019' }, { id:3, msg: 'msg1', date: 'May 25 2019' }, { id:4, msg: 'msg1', date: 'May 25 2019' }, ]

const res = Object.values(
                  data.reduce((ac,a) => (ac[a.date] = (ac[a.date] || []).concat(a),ac),{})
             ).map(x => ({data:[...x],date:x[0].date}))

console.log(res)
0 голосов
/ 23 мая 2019

let data = [
    {
        id: 1,
        msg: 'msg1',
        date: 'May 24 2019'
    },
    {
        id: 2,
        msg: 'msg2',
        date: 'May 24 2019'
    },
    {
        id: 3,
        msg: 'msg1',
        date: 'May 25 2019'
    },
    {
        id: 4,
        msg: 'msg1',
        date: 'May 25 2019'
    },
];

let result = {}

data.map(val=>{
    if(result[val.date]){
        return result[val.date] = {...result[val.date], value: [...result[val.date].value, val]}
    }else{
        return result[val.date] = {date: val.date, value: [val]}
    }
})

console.log(Object.values(result));
...