перемещение записей внутри объекта — почему пострадали все, кроме одного?

#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] .