Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Отформатировать объект по дням недели (https://javascript.ru/forum/misc/73045-otformatirovat-obekt-po-dnyam-nedeli.html)

kakadyi 16.03.2018 20:59

Отформатировать объект по дням недели
 
Здравствуйте!
Есть определенный объект с графиками работы:
{ 'пн': '7:00-19:00',
  'вт': '9:00-19:00',
  'ср': '9:00-19:00',
  'чт': '9:00-19:00',
  'пт': '9:00-19:00',
  'сб': '10:00-15:00',
  'вс': '10:00-15:00' }

Необходимо привести данный объект к следующему виду:
{ 'пн': '7:00-19:00',
  'вт-пт': '9:00-19:00',
  'сб-вс': '10:00-15:00',
   }

При этом графики работы и дни могут быть различными.
Не могу придумать алгоритм...Подскажите,с чего начать.

рони 16.03.2018 21:32

kakadyi,
откажитесь от обьекта, лучше массив обьектов .
алгоритмы решения подобных задач по ссылке ниже
http://javascript.ru/forum/misc/7245...ie-yandex.html

Nexus 16.03.2018 21:33

Вроде работает.
var shedule={
		'пн': '7:00-19:00',
		'вт': '9:00-19:00',
		'ср': '9:00-19:00',
		'чт': '9:00-19:00',
		'пт': '9:00-19:00',
		'сб': '10:00-15:00',
		'вс': '10:00-15:00'
	},
	__week_days=['пн','вт','ср','чт','пт','сб','вс'],
	response=Object.keys(shedule).map(function(day){
		return {
			day:day,
			worktime:shedule[day]
		};
	}).sort(function(a,b){
		return __week_days.indexOf(a.day)-__week_days.indexOf(b.day);
	}).reduce(function(res,item,index,list){
		var row={from:item.day,to:void 0,worktime:item.worktime};
		if(!res.length)
			return [row];
		
		if(res[res.length-1].worktime==item.worktime)
			res[res.length-1].to=item.day;
		else
			res.push(row);
			
		return res;
	},[]).reduce(function(res,item){
		res[item.from+(item.to?'-'+item.to:'')]=item.worktime;
		
		return res;
	},{});
	
console.log(response);

рони 16.03.2018 22:00

обьект соединение диапазонов
 
kakadyi,
шифровка из центра ...
var obj = {
  'пн': '7:00-19:00',
  'вт': '9:00-19:00',
  'ср': '9:00-19:00',
  'чт': '9:00-19:00',
  'пт': '9:00-19:00',
  'сб': '10:00-15:00',
  'вс': '10:00-15:00' }
function fn(b) {
  var e = void 0;
  return Object.keys(b).reduce(function(f, a, c, d) {
    c = b[a] == b[d[++c]];
    d = void 0 === e;
    c && d ? e = a : c || d ? !c && d && (f[a] = b[a]) : (f[e + "-" + a] = b[a], e = void 0);
    return f;
  }, {});
};
var output =  fn(obj);
alert(JSON.stringify(output));

kakadyi 16.03.2018 22:08

Цитата:

Сообщение от Nexus (Сообщение 480713)
Вроде работает.
var shedule={
		'пн': '7:00-19:00',
		'вт': '9:00-19:00',
		'ср': '9:00-19:00',
		'чт': '9:00-19:00',
		'пт': '9:00-19:00',
		'сб': '10:00-15:00',
		'вс': '10:00-15:00'
	},
	__week_days=['пн','вт','ср','чт','пт','сб','вс'],
	response=Object.keys(shedule).map(function(day){
		return {
			day:day,
			worktime:shedule[day]
		};
	}).sort(function(a,b){
		return __week_days.indexOf(a.day)-__week_days.indexOf(b.day);
	}).reduce(function(res,item,index,list){
		var row={from:item.day,to:void 0,worktime:item.worktime};
		if(!res.length)
			return [row];
		
		if(res[res.length-1].worktime==item.worktime)
			res[res.length-1].to=item.day;
		else
			res.push(row);
			
		return res;
	},[]).reduce(function(res,item){
		res[item.from+(item.to?'-'+item.to:'')]=item.worktime;
		
		return res;
	},{});
	
console.log(response);

После такого мне в свой код смотреть не хочется...:haha:
Просто моё уважение,умеете,могёте:)

Nexus 16.03.2018 22:08

рони, сортировку, наверное, все-таки стоит добавить.
var obj = {
	'ср': '9:00-19:00',
	'пн': '7:00-19:00',
	'вт': '9:00-19:00',
	'чт': '9:00-19:00',
	'пт': '9:00-19:00',
	'сб': '10:00-15:00',
	'вс': '10:00-15:00'
};

function fn(b) {
	var e = void 0;
	return Object.keys(b).reduce(function(f, a, c, d) {
		c = b[a] == b[d[++c]];
		d = void 0 === e;
		c && d ? e = a : c || d ? !c && d && (f[a] = b[a]) : (f[e + "-" + a] = b[a], e = void 0);
		return f;
	}, {});
};
alert(JSON.stringify(fn(obj)));

kakadyi 16.03.2018 22:09

У рони вообще шедевр:)Лаконично,красиво.

рони 16.03.2018 22:15

Цитата:

Сообщение от Nexus
все-таки стоит добавить.

сортировка тут неуместна!!!
обьект желательно с нужной структурой или что лучше массив тоже с нужной структурой.
и вопрос имея __week_days=['пн','вт','ср','чт','пт','сб','вс'],
зачем тогда Object.keys(shedule)?

рони 16.03.2018 22:21

Цитата:

Сообщение от Nexus
сортировку, наверное, все-таки стоит добавить.

добавил :)
var obj = {
	'ср': '9:00-19:00',
	'пн': '7:00-19:00',
	'вт': '9:00-19:00',
	'чт': '9:00-19:00',
	'пт': '9:00-19:00',
	'сб': '10:00-15:00',
	'вс': '10:00-15:00'
};

function fn(b) {
	var e = void 0;
	return ['пн','вт','ср','чт','пт','сб','вс'].reduce(function(f, a, c, d) {
		c = b[a] == b[d[++c]];
		d = void 0 === e;
		c && d ? e = a : c || d ? !c && d && (f[a] = b[a]) : (f[e + "-" + a] = b[a], e = void 0);
		return f;
	}, {});
};
alert(JSON.stringify(fn(obj)));

Nexus 16.03.2018 22:50

Цитата:

Сообщение от рони
и вопрос имея __week_days=['пн','вт','ср','чт','пт','сб','вс'],
зачем тогда Object.keys(shedule)?

Хотел, чтобы код переварил любой объект, который ему дадут, даже подобный (вторник пропущен):
{
	'ср': '9:00-19:00',
	'пн': '7:00-19:00',
	'чт': '9:00-19:00',
	'пт': '9:00-19:00',
	'сб': '10:00-15:00',
	'вс': '10:00-15:00',
	'аб': '10:00-15:00',
	'бц': '10:00-15:00',
	'цд': '10:00-15:00'
};


Часовой пояс GMT +3, время: 20:53.