简体   繁体   English

如何按天分组并在对象数组中找到最小值和最大值?

[英]How to group by day and find min and max value in an array of object?

I have an array of object like that: 我有一个像这样的对象数组:

0:
  name: "Temp"
  series: Array(505)
    [0 … 99]
      0: {name: "2019-6-29 7:00:00 PM", value: 30.8}
      1: {name: "2019-6-29 8:00:00 PM", value: 29.67}
      2: {name: "2019-6-29 9:00:00 PM", value: 28.68}
      3: {name: "2019-6-29 10:00:00 PM", value: 27.83}
      4: {name: "2019-6-29 11:00:00 PM", value: 26.28}
      5: {name: "2019-6-30 12:00:00 AM", value: 25.29}
      6: {name: "2019-6-30 1:00:00 AM", value: 24.72}
      7: {name: "2019-6-30 2:00:00 AM", value: 24.16}
      8: {name: "2019-6-30 3:00:00 AM", value: 24.16}
      9: {name: "2019-6-30 4:00:00 AM", value: 24.02}
      10: {name: "2019-6-30 5:00:00 AM", value: 23.03}
      11: {name: "2019-6-30 6:00:00 AM", value: 23.31}
      12: {name: "2019-6-30 7:00:00 AM", value: 23.03}
      13: {name: "2019-6-30 8:00:00 AM", value: 22.89}
      14: {name: "2019-6-30 9:00:00 AM", value: 23.03}
      15: {name: "2019-6-30 10:00:00 AM", value: 23.73}
      16: {name: "2019-6-30 11:00:00 AM", value: 25.01}
      17: {name: "2019-6-30 12:00:00 PM", value: 24.86}
      18: {name: "2019-6-30 1:00:00 PM", value: 31.5}
      19: {name: "2019-6-30 2:00:00 PM", value: 40.83}
      20: {name: "2019-6-30 3:00:00 PM", value: 33.62}
      21: {name: "2019-6-30 4:00:00 PM", value: 28.39}
      22: {name: "2019-6-30 5:00:00 PM", value: 29.38}
      23: {name: "2019-6-30 6:00:00 PM", value: 28.11}
      24: {name: "2019-6-30 7:00:00 PM", value: 27.27}
      25: {name: "2019-6-30 8:00:00 PM", value: 26.14}
      26: {name: "2019-6-30 9:00:00 PM", value: 25.15}
      27: {name: "2019-6-30 10:00:00 PM", value: 24.44}
      28: {name: "2019-6-30 11:00:00 PM", value: 24.16}

How can I use these data to have a new array of object like that: 我如何使用这些数据来创建一个新的对象数组,如下所示:

0: {name: "2019-6-29", min: minValueForThatDay, max: maxValueForThatDay}
1: {name: "2019-6-30", min: minValueForThatDay, max: maxValueForThatDay}

I already tried with reduce and map, but with no luck yet 我已经尝试过reduce和map,但是还没有运气

You can use reduce 您可以使用减少

  • Loop over data 遍历数据
  • split name upto first space character ( as this seems common pattern for name ) 将名称拆分为第一个空格字符(因为这似乎是name的常见模式)
  • check if name is already present as key or not, if it's not present set initial value 检查名称是否已经作为键存在,如果不存在则设置初始值
  • check for min and max key and update values accordingly 检查最小和最大键并相应地更新值

 let data = [{name: "2019-6-29 7:00:00 PM", value: 30.8}, {name: "2019-6-29 8:00:00 PM", value: 29.67},{name: "2019-6-29 9:00:00 PM", value: 28.68},{name: "2019-6-29 10:00:00 PM", value: 27.83},{name: "2019-6-29 11:00:00 PM", value: 26.28},{name: "2019-6-30 12:00:00 AM", value: 25.29},{name: "2019-6-30 1:00:00 AM", value: 24.72},{name: "2019-6-30 2:00:00 AM", value: 24.16},{name: "2019-6-30 3:00:00 AM", value: 24.16},{name: "2019-6-30 4:00:00 AM", value: 24.02},{name: "2019-6-30 5:00:00 AM", value: 23.03},{name: "2019-6-30 6:00:00 AM", value: 23.31},{name: "2019-6-30 7:00:00 AM", value: 23.03},{name: "2019-6-30 8:00:00 AM", value: 22.89},{name: "2019-6-30 9:00:00 AM", value: 23.03},{name: "2019-6-30 10:00:00 AM", value: 23.73}] let final = data.reduce((op,{name, value}) => { let [date] = name.split(' ',1) op[date] = op[date] || {name, min: Infinity, max: -Infinity} op[date].min = op[date].min > value ? value : op[date].min op[date].max = op[date].max < value ? value : op[date].max return op },{}) console.log(Object.values(final)) 

try this: 尝试这个:

 const data = [{name: "2019-6-29 7:00:00 PM", value: 30.8}, {name: "2019-6-29 8:00:00 PM", value: 29.67}, {name: "2019-6-29 9:00:00 PM", value: 28.68}, {name: "2019-6-29 10:00:00 PM", value: 27.83}, {name: "2019-6-29 11:00:00 PM", value: 26.28}, {name: "2019-6-30 12:00:00 AM", value: 25.29}, {name: "2019-6-30 1:00:00 AM", value: 24.72}, {name: "2019-6-30 2:00:00 AM", value: 24.16}, {name: "2019-6-30 3:00:00 AM", value: 24.16}, {name: "2019-6-30 4:00:00 AM", value: 24.02}, {name: "2019-6-30 5:00:00 AM", value: 23.03}, {name: "2019-6-30 6:00:00 AM", value: 23.31}, {name: "2019-6-30 7:00:00 AM", value: 23.03}, {name: "2019-6-30 8:00:00 AM", value: 22.89}, {name: "2019-6-30 9:00:00 AM", value: 23.03}, {name: "2019-6-30 10:00:00 AM", value: 23.73}] const groupBy = (arr) => arr.reduce((acc, ele)=>( (acc[ele.name.split(' ')[0]] = acc[ele.name.split(' ')[0]] || []).push(ele), acc),{}) const max = (arr) => Math.max(...arr.map(res=>res.value)) const min = (arr) => Math.min(...arr.map(res=>res.value)) const result = Object.entries(groupBy(data)).map(([key, val])=> ({name:key, min:min(val), max: max(val)})) console.log(result); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM