-4

I have this object:

    "monday": [],
    "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}
    ],
    "sunday": [
      { "type": "close", "value": 3600 },
      { "type": "open", "value": 43200 },
      { "type": "close", "value": 75600 }
    ]
}

And I wish to move every first entry where "type" === "close" to the previous entry, So in this example it'll change to:

{
    "monday": [],
    "tuesday": [
      { "type": "open", "value": 36000 },
      { "type": "close", "value": 64800 }
    ],
    "wednesday": [],
    "thursday": [
      { "type": "open", "value": 36000 },
      { "type": "close", "value": 64800 }
    ],
    "friday": [
      { "type": "open", "value": 36000 },
      {"type": "close","value": 3600},
],
    "saturday": [
      {"type": "open","value": 32400},
      {"type": "close","value": 39600},
      {"type": "open","value": 57600},
      { "type": "close", "value": 3600 }
    ],
    "sunday": [
      { "type": "open", "value": 43200 },
      { "type": "close", "value": 75600 }
    ]
}

What is the easiest and most advance way to achieve that? Thanks!

Taaa
  • 25
  • 7
  • what if `monday` object has a property whose first object is of type `close`? Then what do you want? – DecPK Jul 03 '21 at 23:11
  • Consider using a Map as properties of plain object are not guaranteed to be in order of insertion.https://stackoverflow.com/a/5525820/3423750 – Phalgun Jul 03 '21 at 23:28
  • Thanks guys. @decpk I added another if for the discussed case – Taaa Jul 04 '21 at 15:33

1 Answers1

1

One option is to use a basic for loop, do some checks, then shift it onto the previous item.

const keys = Object.keys(obj)
for (let i in keys)
  if (
    typeof obj[keys[i]][0] !== 'undefined' && 
    typeof obj[keys[i-1]] !== 'undefined' && 
    obj[keys[i]][0].type === 'close'
  )
    obj[keys[i-1]].push(obj[keys[i]].shift())

const obj = {
  "monday": [],
  "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
    }
  ],
  "sunday": [{
      "type": "close",
      "value": 3600
    },
    {
      "type": "open",
      "value": 43200
    },
    {
      "type": "close",
      "value": 75600
    }
  ]
}

const keys = Object.keys(obj)
for (let i in keys)
  if (
    typeof obj[keys[i]][0] !== 'undefined' &&
    typeof obj[keys[i - 1]] !== 'undefined' &&
    obj[keys[i]][0].type === 'close'
  )
    obj[keys[i - 1]].push(obj[keys[i]].shift())
    
console.log(obj)
Lawrence Cherone
  • 46,049
  • 7
  • 62
  • 106
  • Thank you @Lawrence ! It helped me a lot. – Taaa Jul 04 '21 at 15:30
  • I added another if condition to check regarding the first entry: if (typeof obj[keys[i]][0] !== 'undefined' && obj[keys[i]][0].type === 'close') { obj[keys[keys.length - 1]].push(obj[keys[i]].shift()); } – Taaa Jul 04 '21 at 15:31