【问题标题】:Get the max value for a date from an array of objects从对象数组中获取日期的最大值
【发布时间】:2018-04-24 11:56:00
【问题描述】:

在一个 React.js 组件中,我有这个数组:

const array = [{
  date: '2017-12-21T07:43:00Z',
  value: 7000
}, {
  date: '2017-12-21T09:41:00Z',
  value: 1500,
}, {
  date: '2017-12-23T10:59:00Z',
  value: 2000
}]

我想要得到的是特定日期的值的总和(我在我的项目中使用 Moment)。

从此我可以从列表中获取最大值,如下所示:

function getMaxValue () {
  const { data } = this.props
  return data.reduce((max, item) => item.value > max ? item.value : max, data[0].value)
}

不过,这样做的结果是7000,而不是8500

我也可以使用 Ramda 方法,但找不到合适的方法。

【问题讨论】:

标签: javascript arrays reactjs max grouping


【解决方案1】:

您可以使用array#reduce 对同一日期的对象的值求和。 然后使用Math.maxObject.values() 得到最大值。

const array = [{ date: '2017-12-21T07:43:00Z', value: 7000 }, { date: '2017-12-21T09:41:00Z', value: 1500, }, { date: '2017-12-23T10:59:00Z', value: 2000 }],
      result = array.reduce((r, {date, value}) => {
        date = date.substring(0,10);
        r[date] = (r[date] || 0) + value;
        return r;
      },{});
const maxValue = Math.max(...Object.values(result));
console.log(maxValue);

【讨论】:

    【解决方案2】:

    首先,您必须使用hash 结构按date 字段对数组进行分组。

    那么,您只需将Math.max 方法与spread syntax 结合使用即可达到您的要求。

    const array = [{ date: '2017-12-21T07:43:00Z', value: 7000 }, { date: '2017-12-21T09:41:00Z', value: 1500, }, { date: '2017-12-23T10:59:00Z', value: 2000 }]
    
    let grouped = [];
    array.forEach(function (o) {
        let date = o.date.substring(0, 10);
        if (!this[date]) {
            this[date] = { date: date, value: 0 };
            grouped.push(this[date]);
        }
        this[date].value += o.value;
    }, Object.create(null));
    
    console.log(Math.max(...grouped.map(a => a.value)));

    【讨论】:

    • 结果是 7000,而不是 8500,OP 希望 获取特定日期的值的总和
    【解决方案3】:

    这个答案是使用 moment js 。

    我正在创建一个对象,其中日期作为键,值作为这些日期的累积值。

    在创建对象时,我比较最大值并返回它

    const array = [{
      date: '2017-12-21T07:43:00Z',
      value: 7000
    }, {
      date: '2017-12-21T09:41:00Z',
      value: 1500,
    }, {
      date: '2017-12-23T10:59:00Z',
      value: 2000
    }]
    
    function getMaxValue(){
     let res = {};
     let max = Number.MIN_VALUE
     array.forEach(obj => {
       let key = moment(obj.date).format('YYYY-MM-DD');
        res[key] = res[key]? res[key]+ obj.value: obj.value
       if(res[key] > max){
         max = res[key];
       }
     });
    
     return max;
    }
    
    getMaxValue()
    

    【讨论】:

      猜你喜欢
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      相关资源
      最近更新 更多