按日期分组对象值

时间:2020-07-15 20:08:57

标签: javascript reactjs react-native object

我正在尝试在react native上做一个即将发生的事件,我有这个对象

const calendatData = [
        {
            "data": [
              {
                "id": 25,
                "title": "Spotify",
                "name": "Family",
                "service_id": 1,
                "repetition": "Monthly",
                "price": "79000",
                "upcoming_date": [
                  "2020-08-07T13:35:44.606Z"
                ]
              },
              {
                "id": 26,
                "title": "Netflix",
                "name": "Mobile",
                "service_id": 2,
                "repetition": "Monthly",
                "price": "49000",
                "upcoming_date": [
                  "2020-08-18T13:35:44.600Z",
                  "2020-08-07T13:35:44.606Z"
                ]
              },
              {
                "id": 27,
                "title": "iTunes",
                "name": "Weekly Special",
                "service_id": 3,
                "repetition": "Weekly",
                "price": "22000",
                "upcoming_date": [
                  "2020-08-07T13:35:44.606Z",
                  "2020-08-14T13:35:44.606Z",
                  "2020-08-21T13:35:44.606Z",
                  "2020-08-28T13:35:44.606Z"
                ]
              }
            ],
            "status": "success"
          }
    ]

我一直试图做的是基于upcoming_date提取该对象。 我需要的结果就是这样

upcomingData = [
        {
            date: '2020-08-07',
            title: [
                'Spotify',
                'Netflix',
                'iTunes'
            ]
        },
        {
            date: '2020-08-18',
            title: ['Netflix']
        },
        {
            date: '2020-08-14',
            title: ['iTuunes']
        },
        {
            date: '2020-08-21',
            title: ['iTuunes']
        },
        {
            date: '2020-08-28',
            title: ['iTuunes']
        }
]

在同一日期,如果有多个标题,则应在对象中的同一日期下将其分组。

相反,我得到的是这个物体

upcomingData = [
    {
        title: [
            "Spotify",
            "Netflix",
            "iTunes",
        ],
        date : [
            "2020-08-29",
            "2020-08-07",
            "2020-08-18",
            "2020-08-07",
            "2020-08-07",
            "2020-08-14",
            "2020-08-21",
            "2020-08-28",
        ]
    }
]

这是我的新手,我知道这主要是关于javascript的知识,我们将不胜感激。

谢谢

2 个答案:

答案 0 :(得分:3)

这些想法是:

  • 首先,通过Array.prototype.map()迭代对象,并从转换后的日期开始设置唯一的映射键。
  • 然后将标题推到每个地图的键上。

实际上,您的最终地图(这里是myMap)将是您期望的upcomingData。要输出为预期的对象,可以按照自己的方式制作。

const calendarData = [{ "data": [{ "id": 25, "title": "Spotify", "name": "Family", "service_id": 1, "repetition": "Monthly", "price": "79000", "upcoming_date": ["2020-08-07T13:35:44.606Z"] }, { "id": 26, "title": "Netflix", "name": "Mobile", "service_id": 2, "repetition": "Monthly", "price": "49000", "upcoming_date": ["2020-08-18T13:35:44.600Z", "2020-08-07T13:35:44.606Z"] }, { "id": 27, "title": "iTunes", "name": "Weekly Special", "service_id": 3, "repetition": "Weekly", "price": "22000", "upcoming_date": ["2020-08-07T13:35:44.606Z", "2020-08-14T13:35:44.606Z", "2020-08-21T13:35:44.606Z", "2020-08-28T13:35:44.606Z"] }], "status": "success" }];

var myMap = new Map();

calendarData[0].data.map(element => {

    var dates = [];

    element.upcoming_date.map(date => {

        var upcoming_date = date.slice(0,10);

        if (!myMap.get(upcoming_date)) {
            myMap.set(upcoming_date, []);
        }

        dates.push(upcoming_date);

    });

    var len = dates.length;

    for (let i = 0; i < len; i++) {
        myMap.get(dates[i]).push(element.title);
    }
});

var upcomingData = [];

for (const entry of myMap.entries()) {
    var obj = {};
    obj["date"] = entry[0];
    obj["title"] = entry[1];
    upcomingData.push(obj);
}

console.log(upcomingData);

答案 1 :(得分:2)

您可以

以下是一个快速的实时演示:

const src = [{"data":[{"id":25,"title":"Spotify","name":"Family","service_id":1,"repetition":"Monthly","price":"79000","upcoming_date":["2020-08-07T13:35:44.606Z"]},{"id":26,"title":"Netflix","name":"Mobile","service_id":2,"repetition":"Monthly","price":"49000","upcoming_date":["2020-08-18T13:35:44.600Z","2020-08-07T13:35:44.606Z"]},{"id":27,"title":"iTunes","name":"Weekly Special","service_id":3,"repetition":"Weekly","price":"22000","upcoming_date":["2020-08-07T13:35:44.606Z","2020-08-14T13:35:44.606Z","2020-08-21T13:35:44.606Z","2020-08-28T13:35:44.606Z"]}],"status":"success"}],
    
    result = [...src[0].data
      .reduce((r,{upcoming_date, title}) => (
         upcoming_date.forEach((s,_,__,date=s.slice(0,10)) =>
            r.set(
              date, 
              {date, title: [...(r.get(date)?.title||[]), title]}
            )),r),
         new Map())
      .values()
    ]
    
console.log(result)
.as-console-wrapper{min-height:100%;}