从对象数组中获取日期的最大值

时间:2018-04-24 11:56:00

标签: javascript arrays reactjs max grouping

在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方法,但找不到合适的方法。

3 个答案:

答案 0 :(得分:2)

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

然后,您只需将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)));




答案 1 :(得分:2)

您可以使用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 :(得分:0)

这个答案是使用时刻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()