L oop через массив объектов против другого массива объектов - PullRequest
2 голосов
/ 10 марта 2020

Проблема:

У меня есть Массив объектов, в котором мы получаем количество рабочих часов сотрудника в месяц, например:

{
    "allocationId": 227,
    "role": "Software Engineer",
    "name": "Test User",
    "country": "USA",
    "state": "TX",
    "city": "",
    "allocStartDate": "2019-03-09",
    "allocEndDate": "2020-03-10",
    "allocationHours": [{
            "allocationHoursId": 2250,
            "allocationId": 227,
            "monthYear": "February",
            "year": 2020,
            "workHours": 60,
            "lockStatus": "Y",
            "comments": null
        },
        {
            "allocationHoursId": 2251,
            "allocationId": 227,
            "monthYear": "January",
            "year": 2020,
            "workHours": 10,
            "lockStatus": "N",
            "comments": null
        },
        {
            "allocationHoursId": 2254,
            "allocationId": 227,
            "monthYear": "April",
            "year": 2020,
            "workHours": 40,
            "lockStatus": "N",
            "comments": null
        }
    ],
    "totalHours": 170
}

Мне нужно отформатировать «часы на часах» по месяцам. года, такого, что для месяца, для которого существуют данные, он присваивается месяцу, иначе мы добавляем нулевые значения к месяцу. Пожалуйста, посмотрите на изображение для ясности:

enter image description here

Делая рабочие часы за месяц не представлены до 0.

Что я пробовал :

const scrollableTableAttribute = [
  { key: 'January', value: '01' },
  { key: 'February', value: '02' },
  { key: 'March', value: '03' },
  { key: 'April', value: '04' },
  { key: 'May', value: '05' },
  { key: 'June', value: '06' },
  { key: 'July', value: '07' },
  { key: 'August', value: '08' },
  { key: 'September', value: '09' },
  { key: 'October', value: '10' },
  { key: 'November', value: '11' },
  { key: 'December', value: '12' }
];

And in the method -

      item.allocationHours.forEach((element) => {
        scrollableTableAttribute.map((month) => {
          if (element.monthYear === month.key) {
              test[month.key]  = element;
          } else {
            test[month.key]  = {
              workHours: 0, allocationId: item.allocationId,
              // tslint:disable-next-line: no-null-keyword
              monthYear: month.key, lockStatus: 'N', comment: '', allocationHoursId: null, year: null
            };
          }
        });
      });

Это не дает мне требуемого результата, любая помощь будет оценена. Спасибо!

Ответы [ 3 ]

1 голос
/ 10 марта 2020

Мы можем использовать map метод для прогнозирования всех полученных месяцев / месяцев:

const months = new Map(json.allocationHours.map(s => [s.monthYear, s]));
let fallbackObject = {
    "allocationHoursId": null,
    "allocationId": null,
    "monthYear": null,
    "year": 2020,
    "workHours": 40,
    "lockStatus": "N",
    "comments": null
}

json.allocationHours = scrollableTableAttribute.map(({key}) => 
    ({...months.get(key) || fallbackObject}));

Пример:

let json = {
    "allocationId": 227,
    "role": "Software Engineer",
    "name": "Test User",
    "country": "USA",
    "state": "TX",
    "city": "",
    "allocStartDate": "2019-03-09",
    "allocEndDate": "2020-03-10",
    "allocationHours": [{
            "allocationHoursId": 2250,
            "allocationId": 227,
            "monthYear": "February",
            "year": 2020,
            "workHours": 60,
            "lockStatus": "Y",
            "comments": null
        },
        {
            "allocationHoursId": 2251,
            "allocationId": 227,
            "monthYear": "January",
            "year": 2020,
            "workHours": 10,
            "lockStatus": "N",
            "comments": null
        },
        {
            "allocationHoursId": 2254,
            "allocationId": 227,
            "monthYear": "April",
            "year": 2020,
            "workHours": 40,
            "lockStatus": "N",
            "comments": null
        }
    ],
    "totalHours": 170
}

const scrollableTableAttribute = [
    { key: 'January', value: '01' },
    { key: 'February', value: '02' },
    { key: 'March', value: '03' },
    { key: 'April', value: '04' },
    { key: 'May', value: '05' },
    { key: 'June', value: '06' },
    { key: 'July', value: '07' },
    { key: 'August', value: '08' },
    { key: 'September', value: '09' },
    { key: 'October', value: '10' },
    { key: 'November', value: '11' },
    { key: 'December', value: '12' }
  ];

const months = new Map(json.allocationHours.map(s => [s.monthYear, s]));

let fallbackObject = {
    "allocationHoursId": null,
    "allocationId": null,
    "monthYear": null,
    "year": 2020,
    "workHours": 40,
    "lockStatus": "N",
    "comments": null
}

json.allocationHours = scrollableTableAttribute.map(({key}) => ({...months.get(key) || fallbackObject}));
console.log(json);
1 голос
/ 10 марта 2020

Поскольку у вашего item есть дата начала и окончания, вы можете фактически сгенерировать все месяцы, которые охватывают этот период, принимая во внимание, что он может пересекать одну или несколько границ года и может начинаться / заканчиваться где угодно в течение года .

Вы можете преобразовать комбинации года / месяца в одно число, представляющее абсолютное количество месяцев.

Вот как это может выглядеть:

const item = {"allocationId": 227,"role": "Software Engineer","name": "Test User","country": "USA","state": "TX","city": "","allocStartDate": "2019-03-09","allocEndDate": "2020-03-10","allocationHours": [{"allocationHoursId": 2250,"allocationId": 227,"monthYear": "February","year": 2020,"workHours": 60,"lockStatus": "Y","comments": null},{"allocationHoursId": 2251,"allocationId": 227,"monthYear": "January","year": 2020,"workHours": 10,"lockStatus": "N","comments": null},{"allocationHoursId": 2254,"allocationId": 227,"monthYear": "April","year": 2020,"workHours": 40,"lockStatus": "N","comments": null}],"totalHours": 170};

const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];

const toMonths = (dateStr) => dateStr.slice(0, 4) * 12 + +dateStr.slice(5, 7) - 1;

const startMonth = toMonths(item.allocStartDate);

const result = Array.from({length: toMonths(item.allocEndDate) + 1 - startMonth}, (_, i) => ({ 
    allocationHoursId: null,
    allocationId: item.allocationId,
    monthYear: months[(startMonth + i) % 12], 
    year: Math.floor((startMonth + i) / 12),
    workHours: 0, lockStatus: "N", comments: ""
}));

for (const obj of item.allocationHours) {
    result[obj.year * 12 + months.indexOf(obj.monthYear) - startMonth] = obj;
}

console.log(result);
1 голос
/ 10 марта 2020

Итак, учитывая условия, что каждая запись месяца отличается от объекта значений, лучше l oop выбросить массив месяцев. Попробуй это:

const YOUR_OBJECT = {
    "allocationId": 227,
    "role": "Software Engineer",
    "name": "Test User",
    "country": "USA",
    "state": "TX",
    "city": "",
    "allocStartDate": "2019-03-09",
    "allocEndDate": "2020-03-10",
    "allocationHours": [{
            "allocationHoursId": 2250,
            "allocationId": 227,
            "monthYear": "February",
            "year": 2020,
            "workHours": 60,
            "lockStatus": "Y",
            "comments": null
        },
        {
            "allocationHoursId": 2251,
            "allocationId": 227,
            "monthYear": "January",
            "year": 2020,
            "workHours": 10,
            "lockStatus": "N",
            "comments": null
        },
        {
            "allocationHoursId": 2254,
            "allocationId": 227,
            "monthYear": "April",
            "year": 2020,
            "workHours": 40,
            "lockStatus": "N",
            "comments": null
        }
    ],
    "totalHours": 170
};

const scrollableTableAttribute = [
  { key: 'January', value: '01' },
  { key: 'February', value: '02' },
  { key: 'March', value: '03' },
  { key: 'April', value: '04' },
  { key: 'May', value: '05' },
  { key: 'June', value: '06' },
  { key: 'July', value: '07' },
  { key: 'August', value: '08' },
  { key: 'September', value: '09' },
  { key: 'October', value: '10' },
  { key: 'November', value: '11' },
  { key: 'December', value: '12' }
];

const test = {};
scrollableTableAttribute.forEach( (month) => {
test[month.key] = YOUR_OBJECT.allocationHours.find((item) => month.key === item.monthYear) || {
            workHours: 0, allocationId: YOUR_OBJECT.allocationId,
            monthYear: month.key, lockStatus: 'N', comment: '', allocationHoursId: null, 
            year: null
  };
});
console.log(test)

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

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