首页 > 解决方案 > 根据对象中键的值对数组中的对象进行分组

问题描述

我有以下要根据日期排序的数据 - 不包括时间戳。

注意:我有权moment执行此任务。

我的数据如下所示:

const data = [
   {
     "fixture": "AC v Inter",
     "kickOffTime": "2018-06-14T15:00:00Z",
   },
   {
     "fixture": "DC v NYC",
     "kickOffTime": "2018-06-15T12:00:00Z",
   },
   {
     "fixture": "AFC v LPC",
     "kickOffTime": "2018-06-15T15:00:00Z",
   },
   {
      "fixture": "DTA v MC",
      "kickOffTime": "2018-06-15T18:00:00Z",
    },
    {
       "fixture": "LAC v GC",
       "kickOffTime": "2018-06-16T18:00:00Z",
    }
];

我尝试了多种方法。我希望达到的最终结果是以下数据结构。

const updatedDataStructure = [
   {
     date: "2018-06-14",
     fixtures: [{
        "fixture": "AC v Inter",
        "kickOffTime": "2018-06-14T15:00:00Z",
      }]
   },
   {
     date: "2018-06-15",
     fixtures: [
      {
        "fixture": "DC v NYC",
        "kickOffTime": "2018-06-15T12:00:00Z",
       }, 
      {
        "fixture": "AFC v LPC",
       "kickOffTime": "2018-06-15T15:00:00Z",
      },
      {
        "fixture": "DTA v MC",
        "kickOffTime": "2018-06-15T18:00:00Z",
       },
     ]
   }, 
   {
     date: "2018-06-16",
     fixtures: [{
         "fixture": "LAC v GC",
         "kickOffTime": "2018-06-16T18:00:00Z",
     }]
   },
];

这是我最近的尝试,几乎奏效了:

const result = fixtures.reduce(function (r, a) {
  r[moment(a.kickOffTime).format('ddd Do MMM')] = r[moment(a.kickOffTime).format('ddd Do MMM')] || [];
  r[moment(a.kickOffTime).format('ddd Do MMM')].push(a);
  return r;
}, Object.create(null));

标签: javascriptecmascript-6reduce

解决方案


您可以将使用的数组分组reduce到一个对象中。使用Object.values您可以将对象转换为数组。

const data = [{
    "fixture": "AC v Inter",
    "kickOffTime": "2018-06-14T15:00:00Z",
  },
  {
    "fixture": "DC v NYC",
    "kickOffTime": "2018-06-15T12:00:00Z",
  },
  {
    "fixture": "AFC v LPC",
    "kickOffTime": "2018-06-15T15:00:00Z",
  },
  {
    "fixture": "DTA v MC",
    "kickOffTime": "2018-06-15T18:00:00Z",
  },
  {
    "fixture": "LAC v GC",
    "kickOffTime": "2018-06-16T18:00:00Z",
  }
];

const result = Object.values(data.reduce((c, v) => {
  let t = v['kickOffTime'].split('T', 1)[0];
  c[t] = c[t] || {date: t,fixtures: []}
  c[t].fixtures.push(v);
  return c;
}, {}));

console.log(result);


推荐阅读