Получить максимальное значение для даты из массива объектов - PullRequest
0 голосов
/ 24 апреля 2018

В компоненте 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
}]

То, что я хочу получить, - это сумма значений на определенную дату (я использую момент в моем проекте).

С этого момента я могу получить максимальное значение из списка, например:

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

Тем не менее, получается 7000 вместо 8500.

Я тоже могу использовать методы Рамды, но не могу найти подходящий.

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

В этом ответе используется момент 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()
0 голосов
/ 24 апреля 2018

Вы можете использовать array#reduce для суммирования стоимости объекта на ту же дату.Затем используйте Math.max с Object.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);
0 голосов
/ 24 апреля 2018

Прежде всего, вам нужно сгруппировать массив по полю date, используя структуру hash.

Затем вам просто нужно использовать метод Math.max в сочетании с синтаксисом разброса , чтобы удовлетворить ваши требования.

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)));
...