Получить месяцы и недели из диапазона с моментами - PullRequest
0 голосов
/ 04 марта 2019

Если у меня есть что-то вроде:

let start = moment('2019-01-27');
let end = moment('2019-02-28');

Как получить начало и конец реальных месяцев, а также начало и конец недель, чтобы я мог посчитать некоторые данные за эти недели и месяцы.У меня есть это для рабочих дней:

getWeekdays(data, labels) {
        let start = moment(this.$store.state.labels[0]);
        let end = moment(this.$store.state.labels[this.$store.state.labels.length - 1]);
        let new_labels = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
        let store_labels = this.$store.state.labels;
        let store_data = this.$store.state.data;
        let new_data = [];
        for(let i=1; i<8; i++) {
            var arr = [];
            let tmp = start.clone().day(i);
            if( tmp.isAfter(start, 'd') ){
              arr.push(tmp.format('YYYY-MM-DD'));
            }
            while( tmp.isBefore(end) ){
              tmp.add(7, 'days');
              arr.push(tmp.format('YYYY-MM-DD'));
            }
            arr.pop();
            let count = 0;
            _.forEach(arr, function(val) {
                let key = store_labels.findIndex(function(i){return i === val});
                count = count + store_data[key];
            });
            new_data.push(count);
        }
        console.log(new_data);
        return {data: new_data, labels: new_labels};
      }

Где data = [1,2,5,3,8] и labels = ['2019-01-27','2019-01-28','2019-01-29','2019-01-30','2019-01-31'], и это работает, но я не уверен, как это сделать месяцами и неделями.

1 Ответ

0 голосов
/ 04 марта 2019

Это ответ на месяцы, только если кому-то нужно: D

let new_range = {};
        _.forEach(labels, function(value, key) {
            new_range[moment(value).format('YYYY MM')] = [];
        });
        _.forEach(labels, function(value, key) {
            new_range[moment(value).format('YYYY MM')].push(data[key]);
        });
        let new_labels = Object.keys(new_range);
        let new_data = [];
        _.forEach(new_range, function(value, key) {
            new_data.push(_.sumBy(value, function(n) {return n;}));
        });

        return {data: new_data, labels: new_labels};

И после целого дня вот один на реальные недели:

const range = ['2019-01-22', '2019-01-23', '2019-01-24', '2019-01-25', '2019-01-26', '2019-01-27', '2019-01-28', '2019-01-29', '2019-01-30', '2019-01-31', '2019-02-01', '2019-02-02', '2019-02-03', '2019-02-04', '2019-02-05', '2019-02-06', '2019-02-07', '2019-02-08', '2019-02-09', '2019-02-10', '2019-02-11', '2019-02-12', '2019-02-13', '2019-02-14', '2019-02-15', '2019-02-16', '2019-02-17', '2019-02-18', '2019-02-19', '2019-02-20', '2019-02-21', '2019-02-22', '2019-02-23', '2019-02-24', '2019-02-25', '2019-02-26', '2019-02-27', '2019-02-28', '2019-03-01'];
const backup = ['2019-01-22', '2019-01-23', '2019-01-24', '2019-01-25', '2019-01-26', '2019-01-27', '2019-01-28', '2019-01-29', '2019-01-30', '2019-01-31', '2019-02-01', '2019-02-02', '2019-02-03', '2019-02-04', '2019-02-05', '2019-02-06', '2019-02-07', '2019-02-08', '2019-02-09', '2019-02-10', '2019-02-11', '2019-02-12', '2019-02-13', '2019-02-14', '2019-02-15', '2019-02-16', '2019-02-17', '2019-02-18', '2019-02-19', '2019-02-20', '2019-02-21', '2019-02-22', '2019-02-23', '2019-02-24', '2019-02-25', '2019-02-26', '2019-02-27', '2019-02-28', '2019-03-01'];
const data = [5,2,3,1,5,5,2,3,1,5,5,2,3,1,5,5,2,3,1,5,5,2,3,1,5,5,2,3,1,5,5,2,3,1,5,5,2,3,1];
console.log(bindData(data, backup, getWeeks(range)));


function bindData(data, range, labels) {
    let new_data = {};
    Object.keys(labels).forEach(function(val) {
    let count = 0;
    for(let j = 0; j<labels[val].length; j++) {
        for(let i = 0; i<range.length; i++) {
        if(labels[val][j] == range[i]) {
            count = count + data[i];
        }
      }
    }
    new_data[val] = count;
  });
  return new_data;
}

function getWeeks(labels) {

    let start = moment(labels[0]);
  let new_range = {};
  var arr = [];
  let tmp = start.clone().day(7);
  let sunday = tmp.format('YYYY-MM-DD');
  let sunday_index = labels.indexOf(sunday);
  if(sunday_index === -1) {
    new_range[sunday] = labels;
  }else{
    let first_week = labels.slice(0, sunday_index + 1);
    new_range[first_week[first_week.length - 1]] = first_week;
    labels.splice(0, sunday_index + 1);
    let last_days = labels.length % 7;
    if(last_days != 0) {
      let last_week = labels.splice(labels.length - last_days, last_days);
      new_range[last_week[last_week.length - 1]] = last_week;
    }
    for(let i = 0; i<labels.length; i++) {
    let a = 0;
      new_range[labels[6]] = labels.splice(a, 7);
    }

  }
    return new_range;
}

Теперь по какой-то причине мне нужноиметь массив двойных меток, если бы я использовал один из них, я бы получил пустой массив в функции bindData.Если ты знаешь почему.Отредактируйте его.

...