@killwayne

Как привести дни недели к такому типу?

С апи приходит:

[
  {
     day: 'Понедельник',
     start_time: '18:00',
     end_time: '21:00'
  },
 {
     day: 'Вторник',
     start_time: '18:00',
     end_time: '21:00'
  },
 {
     day: 'Среда',
     start_time: '18:30',
     end_time: '21:40'
  },
  {
     day: 'Четверг',
     start_time: '18:00',
     end_time: '21:00'
  },
]


И нужно привести к такому типу:
"склеивать дни недели с схожими часами"

Пн-Ср, с 09:00 до 18:00
Чт-Пт, с 10:00 до 19:00
Суббота, с 12:00 до 15:00

Подскажите алгоритм работы, а то никак не могу решить задачу(
  • Вопрос задан
  • 156 просмотров
Решения вопроса 2
zendor
@zendor
const resp = [
  {
    day: 'Понедельник',
    start_time: '18:00',
    end_time: '21:00'
  },
  {
     day: 'Вторник',
     start_time: '18:00',
     end_time: '21:00'
  },
  {
    day: 'Среда',
    start_time: '18:00',
    end_time: '21:00'
  },
  {
    day: 'Четверг',
    start_time: '17:30',
    end_time: '21:00'
  },
  {
    day: 'Пятница',
    start_time: '12:30',
    end_time: '21:00'
  },
  {
    day: 'Суббота',
    start_time: '18:00',
    end_time: '21:00'
  },
  {
    day: 'Воскресенье',
    start_time: '18:00',
    end_time: '21:00'
  }
];

const days = resp.reduce((a, c, i) => {
  if (!i || a[a.length - 1].start_time != c.start_time || a[a.length - 1].end_time != c.end_time) {
    a.push({...c});
  } else {
    a[a.length - 1].day = a[a.length - 1].day.split('-')[0] + `-${c.day}`;
  }
  return a;
}, []).map(o => `${o.day}, с ${o.start_time} до ${o.end_time}`).join('\n');

/* Понедельник-Среда, с 18:00 до 21:00
Четверг, с 17:30 до 21:00
Пятница, с 12:30 до 21:00
Суббота-Воскресенье, с 18:00 до 21:00 */
Ответ написан
@h88p
Pre-Junior HTML Developer
var a = [
  {
     day: 'Понедельник',
     start_time: '18:00',
     end_time: '21:00'
  },
 {
     day: 'Вторник',
     start_time: '18:00',
     end_time: '21:00'
  },
 {
     day: 'Среда',
     start_time: '18:30',
     end_time: '21:40'
  },
  {
     day: 'Четверг',
     start_time: '18:00',
     end_time: '21:00'
  },
]

Если вам нужно склеивать дни, которые идут друг за другом, то:
var arr = [];
for (let q of a){arr.push(q.day + ' ' + q.start_time + ' ' + q.end_time)}
arr = arr.map(w => w.split(' '));
for (var i = 0; i < arr.length-1; i++) {
	if ((arr[i][1] == arr[i+1][1]) && (arr[i][2] == arr[i+1][2])) {
		arr[i][0] += '-'+arr[i+1][0];
		arr.splice(i+1,1);
		i--;
	}
}
arr.map(w => {if(w[0].includes('-')) {return w[0]= w[0].split('-')[0] + '-' + w[0].split('-')[w[0].split('-').length-1]} else {return w[0]}}), arr = arr.map(w => w[0] + ', c ' + w[1] + ' до ' + w[2]).join('\n');

Выведет:
"Понедельник-Вторник, c 18:00 до 21:00
Среда, c 18:30 до 21:40
Четверг, c 18:00 до 21:00"

Если вообще все дни со схожими часами, то:
var arr = [];
for (let q of a){arr.push(q.day + ' ' + q.start_time + ' ' + q.end_time)}
arr = arr.map(w => w.split(' '));
for (var i = 0; i < arr.length; i++) {
	for (var q = i+1; q < arr.length; q++){
        if ((arr[i][1] == arr[q][1]) && (arr[i][2] == arr[q][2])) {
            arr[i][0] += '-'+arr[q][0];
            arr.splice(q,1);
        }
	}
}
arr = arr.map(w => w[0] + ', c ' + w[1] + ' до ' + w[2]).join('\n');

Выведет:
"Понедельник-Вторник-Четверг, c 18:00 до 21:00
Среда, c 18:30 до 21:40"
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы