Получить все записи из массива за последний месяц в формате ГГГГ-ММ-ДД - PullRequest
0 голосов
/ 18 марта 2020

Как найти все объекты в массиве [{value:"String", date:"YYYY-MM-DD"}] с последним указанным месяцем и годом курса? Диапазон лет - 2018-2020. Я хочу что-то вместо нарезки и выравнивания.

Например, я получил: массив из 50 элементов со значением и свойством даты. Значение - это простая цена в строковом формате, а дата выглядит как «2020-02-12», «2019-12-13», «2019-04-28» и так далее. Поэтому мне нужно получить все значения за последний месяц и суммировать их. Так что проблема заключается в нахождении в прошлом месяце. Массив является динамическим c, это означает, что я получил около 300 вариаций массива, в результате в прошлом месяце и году каждый раз может быть разным.

Ответы [ 4 ]

0 голосов
/ 19 марта 2020

Я сам сделал что-то вроде этого:

info.incomes.sort(function(a, b) {
    return new Date(b.date)-new Date(a.date);
});
let comparison =[];
for (let i in info.incomes){    
comparison.push(info.incomes[i].date.substr(0, 7));
}
let lastmonth = 0;
for (let i in comparison){
    if (comparison[0] === comparison[i]){        
        lastmonth+=parseFloat(info.incomes[i].value);
    }      
}

Мне просто нужно подвести итоги за прошлый месяц, поэтому я просто отсортировал их и проверил, соответствуют ли они моему последнему свиданию. Извините за неправильное именование переменных =)

0 голосов
/ 18 марта 2020

насколько я понимаю, вам нужна сумма всех значений за последний месяц. Я думаю, что код ниже, что вам нужно:

let data = [{value: '43.21', date: '2019-07-06'},{value: '24.34', date: '2017-03-03'},{value: '54.32', date: '2020-02-03'},{value: '11.32', date: '2020-02-05'},{value: '34.23', date: '2019-11-21'},{value: '32.34', date: '2020-01-24'},{value: '32.34', date: '2020-02-21'}];

//find last newest record to get it's date
let lastdate=new Date(data.reduce(function (a, b) { return a.date > b.date ? a : b; }).date);


let result = data.reduce(function(sum, e){
			return (isNaN(parseFloat(sum))?0:parseFloat(sum))+(new Date(lastdate.getFullYear(), lastdate.getMonth(), 1) < new Date(e.date) && new Date(e.date) <= new Date(lastdate.getFullYear(), lastdate.getMonth() + 1, 0)?parseFloat(e.value):0) });

document.write("last year/month: " + lastdate.getFullYear()+"/"+(lastdate.getMonth()+1));
document.write("<br>result: "+ result);
0 голосов
/ 19 марта 2020

Учитывая формат даты ГГГГ-ММ-ДД, значения будут сортироваться и сравниваться лексически. Итак, сначала найдите последний месяц, затем отфильтруйте даты в этом месяце, например,

let data = [
  {a:'a', date:'2020-02-12'},
  {a:'a', date:'2019-12-13'},
  {a:'a', date:'2019-04-28'},
  {a:'a', date:'2019-12-15'},
  {a:'a', date:'2020-02-28'},
  {a:'a', date:'2018-12-13'}]; 

// Get last date
let last = data.map(obj => obj.date).sort()[data.length-1];
console.log(last);

// Get objects in last month
let lastMonthsValues = data.filter(
  obj => obj.date.substr(0,7) == last.substr(0,7)
);

// Last month's objects
console.log(lastMonthsValues);

Вы можете сделать то же самое, используя объекты Date, но для этого сначала необходимо выполнить синтаксический анализ Date, а затем сравнить date.getUTCFullYear() и date.getUTCMonth() вместо простых строковых операций.

let data = [
  {a:'a', date:'2020-02-12'},
  {a:'a', date:'2019-12-13'},
  {a:'a', date:'2019-04-28'},
  {a:'a', date:'2019-12-15'},
  {a:'a', date:'2020-02-28'},
  {a:'a', date:'2018-12-13'}]; 

// Get last date
let last = data.map(obj => obj.date).sort((a, b) => new Date(a) - new Date(b))[data.length-1];
console.log(last);

// Get objects in last month
let lastMonthsValues = data.filter(obj => {
  let d0 = new Date(last);
  let d1 = new Date(obj.date);
  return d1.getUTCFullYear() == d0.getUTCFullYear() &&
         d1.getUTCMonth()    == d0.getUTCMonth();
  }
);

// Last month's objects
console.log(lastMonthsValues);

Использование строковых методов намного меньше кода и, вероятно, намного эффективнее.

0 голосов
/ 18 марта 2020

Как я уже упоминал в разделе комментариев, вы можете преобразовать каждую строку, имеющую значения даты, с помощью new Date(), тогда использование .filter() в массиве сделает работу.

См. следующий пример:

const data = [{value: 'val3', date: '2017-05-06'},{value: 'val2', date: '2018-05-06'},{value: 'val1', date: '1988-05-06'},{value: 'val4', date: '2019-03-22'},{value: 'val6', date: '2019-12-24'}];

const result = data.filter(e =>
                                new Date('2018-01-01') < new Date(e.date) &&
                                new Date(e.date) < new Date('2020-01-01')
                          );

console.log(result);

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...