JS для-l oop, чтобы получить разницу в дате в каждом массиве - PullRequest
1 голос
/ 18 апреля 2020

Я пытаюсь подытожить общее количество пропущенных дней каждого участника.

Давайте иметь только двух членов: А и Б. А уехала два раза по разным причинам, она уехала в отпуск на 3 дня и некоторые другие повод на 2 дня. Б. был госпитализирован на 8 дней, ушел в отпуск на 4 дня.

Итак, вот код, который я приложил все усилия.

* Даты, которые я написал, например. Значения даты будут опубликованы JS onclick. Нет необходимости в toString или чем-то еще.

var member = [{
  name : "A",
  absent : [{
    reason : "Leave",
    start_date : "2020-02-01",
    end_date : "2020-02-03"
  },{
    reason : "etc",
    start_date : "2020-02-15",
    end_date : "2020-02-16"
  }
  ]
},{
  name : "B",
  absent : [{
    reason : "Hospitalized",
    start_date : "2020-02-03",
    end_date : "2020-02-10"
  },{
    reason : "Leave",
    start_date : "2020-02-10",
    end_date : "2020-02-13"
  }
  ]
}]

var countAbsentDays = function(){
  var countDays_start = member[0].absent[0].start_date;
  var countDays_end = member[0].absent[0].end_date;
  var diff = (new Date(countDays_end)) - (new Date(countDays_start));
  var count = diff/(1000 * 60 * 60 * 24);
  
  return count;
};

console.log(countabsentDays());

Чтобы собрать общее количество пропущенных дней каждого участника, мне нужно разработать приведенный ниже код, используя for-l oop.

 var countDays_start = member[0].absent[0].start_date;

Думаю, номер индекса, который я поставил 0, можно заменить на переменную. Но я не могу представить, как эта функция работает во всем массиве absent и его элементах absent.start_date и absent.end_date.

Кто-нибудь может помочь?

1 Ответ

1 голос
/ 18 апреля 2020

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

    var member = [{
      name : "A",
      absent : [{
        reason : "Leave",
        start_date : "2020-02-01",
        end_date : "2020-02-03"
      },{
        reason : "etc",
        start_date : "2020-02-15",
        end_date : "2020-02-16"
      }
      ]
    },{
      name : "B",
      absent : [{
        reason : "Hospitalized",
        start_date : "2020-02-03",
        end_date : "2020-02-10"
      },{
        reason : "Leave",
        start_date : "2020-02-10",
        end_date : "2020-02-13"
      }
      ]
    }]

    var countAbsentDays = function(){
      return member.map( m => // map every element of member array to object { [m.name]: (reduced value of absent array) }
          ({
             [m.name]: 
                m.absent.reduce(
                    (acc, x) => 
                      acc + dateDiff(x.end_date, x.start_date)
                , 0 )  // accumulator + dateDiff result returned for every element
           })
      );
      function dateDiff(end, start) {
        var countDays_start = start;
        var countDays_end = end;
        var diff = (new Date(countDays_end)) - (new Date(countDays_start));
        var count = diff/(1000 * 60 * 60 * 24);

        return count;
      }
    };

    console.log(countAbsentDays());
...