#javascript
Вопрос:
Я ломаю голову над этим и буду признателен за помощь.
Взгляните на это:
const obj = {
"monday": [{ "type": "close", "value": 3600 }],
"tuesday": [
{ "type": "open", "value": 36000 },
{ "type": "close", "value": 64800 }
],
"wednesday": [],
"thursday": [
{ "type": "open", "value": 36000 },
{ "type": "close", "value": 64800 }
],
"friday": [{ "type": "open", "value": 36000 }],
"saturday": [
{ "type": "close", "value": 3600 },
{ "type": "open", "value": 32400 },
{ "type": "close", "value": 39600 },
{ "type": "open", "value": 57600 },
{ "type": "close", "value": 82800}
],
"sunday": [
{ "type": "open", "value": 43200 }
]
}
const keys = Object.keys(obj);
for (let i in keys) {
if (
typeof obj[keys[i]][0] !== 'undefined' amp;amp;
typeof obj[keys[i-1]] !== 'undefined' amp;amp;
obj[keys[i]][0].type === 'close'
) {
obj[keys[i-1]].push(obj[keys[i]].shift());
}
if (typeof obj[keys[i]][0] !== 'undefined' amp;amp; obj[keys[i]][0].type === 'close') {
obj[keys[keys.length - 1]].push(obj[keys[i]].shift());
}
if (typeof obj[keys[i]][0] === 'undefined' ) {
obj[keys[i]] = 'Closed'
}
if (obj[keys[i]] !== 'Closed') {
obj[keys[i]]= obj[keys[i]].map(el => {
return new Date(el.value * 1000).toLocaleString('en-US', { hour: 'numeric', hour12: true })
});
}
}
console.log(obj)
если(1).найдите, какой день начинается с «типа»: «закрыть» и переместите его на предыдущий.
если(2). забота о случаях, когда первый день = = «близок».
если(3). изменение формата времени.
Все идет хорошо, но: почему в пятницу извлекается { «тип»: «закрыть», «значение»: 3600}, а не «2 часа ночи» ? как я могу также повлиять на эту запись?
Спасибо
Комментарии:
1. Расскажите нам, каким должен быть ваш ожидаемый результат.
2. Трудно понять, что должно происходить-я бы, вероятно, начал с небольшого рефакторинга кода цикла, чтобы сделать вещи более понятными и менее фу[бар[баз]]-у.
3. ericlippert.com/2014/03/05/how-to-debug-small-programs
4. Я попытался отредактировать вопрос, чтобы он стал более ясным
Ответ №1:
Я пытался понять ваш алгоритм, но, честно говоря, с точки зрения обслуживания сторонних приложений, он указывает все неправильные точки. Я думаю, что пришел к пониманию цели, так что вот кое-что, что кажется более чистым
const
obj =
{ monday: [{ type: 'close', value: 3600 } ]
, tuesday: [{ type: 'open', value: 36000 }
,{ type: 'close', value: 64800 } ]
, wednesday: []
, thursday: [{ type: 'open', value: 36000 }
,{ type: 'close', value: 64800 } ]
, friday: [{ type: 'open', value: 36000 } ]
, saturday: [{ type: 'close', value: 3600 }
,{ type: 'open', value: 32400 }
,{ type: 'close', value: 39600 }
,{ type: 'open', value: 57600 }
,{ type: 'close', value: 82800 } ]
, sunday: [{ type: 'open', value: 43200 } ]
}
, timeformat = { hour: 'numeric', hour12: true }
, val2date =
val => new Date(val * 1000).toLocaleString('en-US',timeformat )
, result =
Object
.keys(obj)
.reduce((r,Day,iDay,a) =>
{
let hCount = obj[Day].length
if (hCount===0 || (hCount===1 amp;amp; obj[Day][0].type==='close' ))
r[Day] = 'closed'
else
{
let isLastOpen = false
, firstHor = (obj[Day][0].type==='close') ? 1 : 0
;
r[Day] = obj[Day].slice(firstHor).map(({type,value},)=>
{
isLastOpen = (type === 'open')
return val2date(value)
})
if (isLastOpen)
{
let nextDay = a[(iDay 1) % a.length]
r[Day].push( val2date(obj[nextDay][0].value) )
}
}
return r
},{})
console.log('result = ', JSON.stringify (result,0,2))
.as-console-wrapper {max-height: 100%!important;top:0 }
Комментарии:
1. Мне это нравится. Спасибо @Mister JoJo
2. если вы потрудитесь объяснить, почему это лучше, чем предыдущее, я был бы вам признателен!
3. @user2533641 Было бы о чем написать, например , о том, что в моем коде всего 2
if
, или об изоляцииval2date
функции; вам также следует избегать написания бессмысленных вещей, таких какobj[keys[i]][0]
.