Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.03.2018, 20:59
Интересующийся
Отправить личное сообщение для kakadyi Посмотреть профиль Найти все сообщения от kakadyi
 
Регистрация: 08.06.2017
Сообщений: 10

Отформатировать объект по дням недели
Здравствуйте!
Есть определенный объект с графиками работы:
{ 'пн': '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',
   }

При этом графики работы и дни могут быть различными.
Не могу придумать алгоритм...Подскажите,с чего начать.
Ответить с цитированием
  #2 (permalink)  
Старый 16.03.2018, 21:32
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

kakadyi,
откажитесь от обьекта, лучше массив обьектов .
алгоритмы решения подобных задач по ссылке ниже
Тестовое задание Yandex
Ответить с цитированием
  #3 (permalink)  
Старый 16.03.2018, 21:33
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,729

Вроде работает.
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);
Ответить с цитированием
  #4 (permalink)  
Старый 16.03.2018, 22:00
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

обьект соединение диапазонов
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));

Последний раз редактировалось рони, 16.03.2018 в 22:09.
Ответить с цитированием
  #5 (permalink)  
Старый 16.03.2018, 22:08
Интересующийся
Отправить личное сообщение для kakadyi Посмотреть профиль Найти все сообщения от kakadyi
 
Регистрация: 08.06.2017
Сообщений: 10

Сообщение от Nexus Посмотреть сообщение
Вроде работает.
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);
После такого мне в свой код смотреть не хочется...
Просто моё уважение,умеете,могёте
Ответить с цитированием
  #6 (permalink)  
Старый 16.03.2018, 22:08
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,729

рони, сортировку, наверное, все-таки стоит добавить.
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)));
Ответить с цитированием
  #7 (permalink)  
Старый 16.03.2018, 22:09
Интересующийся
Отправить личное сообщение для kakadyi Посмотреть профиль Найти все сообщения от kakadyi
 
Регистрация: 08.06.2017
Сообщений: 10

У рони вообще шедеврЛаконично,красиво.
Ответить с цитированием
  #8 (permalink)  
Старый 16.03.2018, 22:15
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Сообщение от Nexus
все-таки стоит добавить.
сортировка тут неуместна!!!
обьект желательно с нужной структурой или что лучше массив тоже с нужной структурой.
и вопрос имея __week_days=['пн','вт','ср','чт','пт','сб','вс'],
зачем тогда Object.keys(shedule)?
Ответить с цитированием
  #9 (permalink)  
Старый 16.03.2018, 22:21
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Сообщение от 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)));
Ответить с цитированием
  #10 (permalink)  
Старый 16.03.2018, 22:50
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,729

Сообщение от рони
и вопрос имея __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'
};
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод картинки по дням недели Dan93 Общие вопросы Javascript 5 28.07.2017 02:19
Показ блока по часам, минутам, и дням недели Tivok Общие вопросы Javascript 10 28.10.2016 18:07
Добавить объект в другой объект фонарик Общие вопросы Javascript 5 11.10.2015 01:57
Создать объект в объекте Bryant-24 Общие вопросы Javascript 3 10.07.2013 16:06
Передать ссылку на объект а не объект возникновения события Blazze Events/DOM/Window 0 11.10.2011 00:45