jojo92
jojo92

Reputation: 27

Group array in object by key

i have a problem for group my object of day, i tested a lot of method but without success i don't know if i can do this with lodash or underscorejs. I have been stuck on it for several days if someone can help me pls. Anyone knows a solution for this?

const schedules = {
Friday : [
 {isOpen: true},
 {morningOpen: "08:30"},
 {morningClose: "12:00"},
 {afternoonOpen: "18:30"},
 {afternoonClose: "18:30"}
],
Monday : [
 {isOpen: true},
 {morningOpen: "08:30"},
 {morningClose: "12:00"},
 {afternoonOpen: "18:30"},
 {afternoonClose: "18:30"}
],
Saturday : [
 {isOpen: true},
 {morningOpen: "08:30"},
 {morningClose: "12:00"},
 {afternoonOpen: "20:30"},
 {afternoonClose: "20:30"}
]
Sunday : [
 {isOpen: true},
 {morningOpen: "08:30"},
 {morningClose: "12:00"},
 {afternoonOpen: "20:30"},
 {afternoonClose: "20:30"}
],
Thursday : [
 {isOpen: true},
 {morningOpen: "08:30"},
 {morningClose: "12:00"},
 {afternoonOpen: "18:30"},
 {afternoonClose: "18:30"}
],
Tuesday : [
 {isOpen: true},
 {morningOpen: "08:30"},
 {morningClose: "12:00"},
 {afternoonOpen: "18:30"},
 {afternoonClose: "18:30"}
],
Wednesday : [
 {isOpen: true},
 {morningOpen: "08:30"},
 {morningClose: "12:00"},
 {afternoonOpen: "18:30"},
 {afternoonClose: "18:30"}
];

and i want this for list my days

schedules1 : [
 {isOpen: true},
 {morningOpen: "08:30"},
 {morningClose: "12:00"},
 {afternoonOpen: "18:30"},
 {afternoonClose: "18:30"},
 {days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
],

schedule2 : [
 {isOpen: true},
 {morningOpen: "08:30"},
 {morningClose: "12:00"},
 {afternoonOpen: "20:30"},
 {afternoonClose: "20:30"},
 {days: ["Sunday", "Saturday"]
];

Thanks

Upvotes: 2

Views: 82

Answers (2)

awmleer
awmleer

Reputation: 1800

const schedules = {
  Friday: {
    isOpen: true,
    morningOpen: "08:30",
    morningClose: "12:00",
    afternoonOpen: "18:30",
    afternoonClose: "18:30"
  },
  Monday: {
    isOpen: true,
    morningOpen: "08:30",
    morningClose: "12:00",
    afternoonOpen: "18:30",
    afternoonClose: "18:30"
  },
  Saturday: {
    isOpen: true,
    morningOpen: "08:30",
    morningClose: "12:00",
    afternoonOpen: "20:30",
    afternoonClose: "20:30"
  },
  Sunday: {
    isOpen: true,
    morningOpen: "08:30",
    morningClose: "12:00",
    afternoonOpen: "20:30",
    afternoonClose: "20:30"
  },
  Thursday: {
    isOpen: true,
    morningOpen: "08:30",
    morningClose: "12:00",
    afternoonOpen: "18:30",
    afternoonClose: "18:30"
  },
  Tuesday: {
    isOpen: true,
    morningOpen: "08:30",
    morningClose: "12:00",
    afternoonOpen: "18:30",
    afternoonClose: "18:30"
  },
  Wednesday: {
    isOpen: true,
    morningOpen: "08:30",
    morningClose: "12:00",
    afternoonOpen: "18:30",
    afternoonClose: "18:30"
  },
}

const groups = []

function getOrCreateGroup(schedule) {
  for (const group of groups) {
    if (
      group.isOpen === schedule.isOpen &&
      group.morningOpen === schedule.morningOpen &&
      group.morningClose === schedule.morningClose &&
      group.afternoonOpen === schedule.afternoonOpen &&
      group.afternoonClose === schedule.afternoonClose
    ) {
      return group
    }
  }
  const newGroup = {
    ...schedule,
    days: [],
  }
  groups.push(newGroup)
  return newGroup
}


for (const key in schedules) {
  const schedule = schedules[key]
  const group = getOrCreateGroup(schedule)
  group.days.push(key)
}

console.log(groups)

Upvotes: 1

Mansour Alnasser
Mansour Alnasser

Reputation: 5030

With the help of lodash, I used _.isEqual and _.isEqual

see: https://lodash.com/docs/4.17.15#isEqual https://lodash.com/docs/4.17.15#isEqual

I also added schedules3 in case.

const schedules = {
Friday : [
 {isOpen: true},
 {morningOpen: "08:30"},
 {morningClose: "12:00"},
 {afternoonOpen: "18:30"},
 {afternoonClose: "18:30"}
],
Monday : [
 {isOpen: true},
 {morningOpen: "08:30"},
 {morningClose: "12:00"},
 {afternoonOpen: "18:30"},
 {afternoonClose: "18:30"}
],
Saturday : [
 {isOpen: true},
 {morningOpen: "08:30"},
 {morningClose: "12:00"},
 {afternoonOpen: "20:30"},
 {afternoonClose: "20:30"}
],
Sunday : [
 {isOpen: true},
 {morningOpen: "08:30"},
 {morningClose: "12:00"},
 {afternoonOpen: "20:30"},
 {afternoonClose: "20:30"}
],
Thursday : [
 {isOpen: true},
 {morningOpen: "08:30"},
 {morningClose: "12:00"},
 {afternoonOpen: "18:30"},
 {afternoonClose: "18:30"}
],
Tuesday : [
 {isOpen: true},
 {morningOpen: "08:30"},
 {morningClose: "12:00"},
 {afternoonOpen: "18:30"},
 {afternoonClose: "18:30"}
],
Wednesday : [
 {isOpen: true},
 {morningOpen: "08:30"},
 {morningClose: "12:00"},
 {afternoonOpen: "18:30"},
 {afternoonClose: "18:30"}
]
};

var schedules1= schedules.Friday;
var schedules2= {};
var schedules3= {};

var schedules1_days = [];
var schedules2_days = [];
var schedules3_days = [];

for (const [key, currentObj] of Object.entries(schedules)) {
    if(_.isEqual(currentObj,schedules1)){
    schedules1_days.push(key);
  }else if(_.isEqual(currentObj,schedules2)){
    schedules2_days.push(key);
  }else if(_.isEqual(currentObj,schedules3)){
    schedules3_days.push(key);
  }else{
    if(_.isEmpty(schedules2)){
      schedules2 = currentObj;
      schedules2_days.push(key);
    }else if(_.isEmpty(schedules3)){
      schedules3 = currentObj;
      schedules3_days.push(key);
    }
    
  }
}

schedules1 = {...schedules1, days: schedules1_days};
schedules2 = {...schedules2, days: schedules2_days};
if(!_.isEmpty(schedules3)){
      schedules3 = {...schedules3, days: schedules3_days};
}


console.log(schedules1);
console.log(schedules2);
console.log(schedules3);
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>

Upvotes: 0

Related Questions