减少数组数组,将数据按日期连接到周数据并对值求和

Joo*_*rts 1 javascript momentjs

所以我有一组特殊的数据:

data: [
  ['2022-01-17T16:29:24', 30], // these below would aggregate to 210
  ['2022-01-17T17:37:24', 30],
  ['2022-01-17T17:41:40', 30],
  ['2022-01-17T17:41:48', 30],
  ['2022-01-21T12:50:18', 30],
  ['2022-01-21T12:50:18', 30],
  ['2022-01-21T12:50:29', 30],        
  ['2022-01-12T12:50:18', 30], // these below would aggregate to 90
  ['2022-01-12T12:50:18', 30],
  ['2022-01-12T12:50:29', 30]
]
Run Code Online (Sandbox Code Playgroud)

我需要将其减少为周数据集。我会将日期转换为一周的开始以获取周数据moment(day).startOf('isoWeek'),然后将相似日期的数据连接起来并将其减少为单个条目。

最终结果如下:

data: [
  ['2022-01-17T00:00:00', 210],
  ['2022-01-10T00:00:00', 90]
]
Run Code Online (Sandbox Code Playgroud)

但我正在寻找如何使用的建议.reduce()或任何其他更现代的解决方案,这些解决方案将在大型设备上发挥作用。现在我为此嵌套了 for 循环(除了看起来很糟糕之外)可能性能很差,因为它在同一个数组上迭代多次。一项要求是moment应该用于日期操作,请尽量避免使用Dateobj。

现在我有这样的事情:

data: [
  ['2022-01-17T16:29:24', 30], // these below would aggregate to 210
  ['2022-01-17T17:37:24', 30],
  ['2022-01-17T17:41:40', 30],
  ['2022-01-17T17:41:48', 30],
  ['2022-01-21T12:50:18', 30],
  ['2022-01-21T12:50:18', 30],
  ['2022-01-21T12:50:29', 30],        
  ['2022-01-12T12:50:18', 30], // these below would aggregate to 90
  ['2022-01-12T12:50:18', 30],
  ['2022-01-12T12:50:29', 30]
]
Run Code Online (Sandbox Code Playgroud)

Riz*_*ani 5

我正在尝试使用reduce 来解决它,但结果将是一个对象。像这样:

const moment = require("moment")
var x = [
    ['2022-01-17T16:29:24', 30], 
    ['2022-01-17T17:37:24', 30],
    ['2022-01-17T17:41:40', 30],
    ['2022-01-17T17:41:48', 30],
    ['2022-01-21T12:50:18', 30],
    ['2022-01-21T12:50:18', 30],
    ['2022-01-21T12:50:29', 30],        
    ['2022-01-12T12:50:18', 30], 
    ['2022-01-12T12:50:18', 30],
    ['2022-01-12T12:50:29', 30]
  ]

// solution
var y = x.reduce((a,b) => {
    const key = moment(b[0]).startOf("isoWeek").format()
    a[key] = a[key]? a[key]+b[1]: b[1]
    return a
}, {})

console.log(y)
Run Code Online (Sandbox Code Playgroud)

输出:

{ 
  "2022-01-17T00:00:00+07:00": 210,
  "2022-01-10T00:00:00+07:00": 90 
}
Run Code Online (Sandbox Code Playgroud)

但如果您希望它像您一样作为数组,我们可以通过以下方式将其转换:

{ 
  "2022-01-17T00:00:00+07:00": 210,
  "2022-01-10T00:00:00+07:00": 90 
}
Run Code Online (Sandbox Code Playgroud)

输出:

[
  [ '2022-01-17T00:00:00+07:00', 210 ],
  [ '2022-01-10T00:00:00+07:00', 90 ]
]
Run Code Online (Sandbox Code Playgroud)

虽然这不是最好的解决方案,但我认为它比嵌套循环更具可读性。

  • 对于最后一个转换步骤,您可以使用 [`Object.entries`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries) (2认同)