首页 > 解决方案 > JS中重构对象的最佳方式

问题描述

我有对象数组、宽度日期和时间属性,如下所示。我尝试按天和时间重组元素。

[
  {
    data: 'data1',
    date: '15-02-2020 06:00:00'
  },
  {
    data: 'data2',
    date: '15-02-2020 12:00:00'
  },
  ...
  {
    data: 'data6',
    date: '17-02-2020 07:00:00'
  },
  {
    data: 'data7',
    date: '17-02-2020 09:00:00'
  }
]

我想得到这个:

{
  '15-02-2020' : {
    '06:00:00' : 'data1',
    '12:00:00' : 'data2'
  },
  '16-02-2020' : {
    '06:00:00' : 'data3',
    '12:00:00' : 'data4'
  },
  '17-02-2020' : {
    '01:00:00' : 'data5',
    '07:00:00' : 'data6',
    '09:00:00' : 'data7'
  }
}

我试过使用reduce,但不能。我想这样做,在一个循环中没有临时变量。

list.reduce((obj, item) => Object.assign(obj, {[item.date]: item}), {});

标签: javascriptobject

解决方案


只需遍历您的数组并动态构建结果对象:

const arr = [
  {
    data: 'data1',
    date: '15-02-2020 06:00:00'
  },
  {
    data: 'data2',
    date: '15-02-2020 12:00:00'
  },
  {
    data: 'data6',
    date: '17-02-2020 07:00:00'
  },
  {
    data: 'data7',
    date: '17-02-2020 09:00:00'
  }
]

const res = {}

arr.forEach(item => {
  const dateArr = item.date.split(' ')
  if (res[dateArr[0]]) {
    res[dateArr[0]][dateArr[1]] = item.data
  } else {
    res[dateArr[0]] = {}
    res[dateArr[0]][dateArr[1]] = item.data
  }
})

console.log(res)


推荐阅读