-2

I have this JS Array ...

   var arr = [{
	"Event_code": "BW-087",
	"Interest_area": "Information technology",
	"Start_time": "9:00 AM",
	"End_time": "3:00 PM",
	"Session_type": "Experience",
	"all_day_evt": true
}, {
	"Event_code": "BW-161",
	"Interest_area": "Media, Communication and creative arts",
	"Start_time": "9:00 AM",
	"End_time": "3:00 PM",
	"Session_type": "Experience",
	"all_day_evt": true
}, {
	"Event_code": "BW-114",
	"Interest_area": "Nursing and midwifery",
	"Start_time": "9:00 AM",
	"End_time": "3:00 PM",
	"Session_type": "Tour",
	"all_day_evt": true
}, {
	"Event_code": "BW-033",
	"Interest_area": "",
	"Start_time": "9:00 AM",
	"End_time": "3:00 PM",
	"Session_type": "General information session",
	"all_day_evt": true
}, {
	"Event_code": "BW-115",
	"Interest_area": "Food, Nutrition and dietetics",
	"Start_time": "9:30 AM",
	"End_time": "3:00 PM",
	"Session_type": "Tour",
	"all_day_evt": true
}, {
	"Event_code": "BW-060",
	"Interest_area": "Sport",
	"Start_time": "9:30 AM",
	"End_time": "3:00 PM",
	"Session_type": "Tour",
	"all_day_evt": true
}, {
	"Event_code": "BW-081",
	"Interest_area": "Information technology",
	"Start_time": "9:00 AM",
	"End_time": "9:30 AM",
	"Session_type": "Course information session",
	"all_day_evt": false
}, {
	"Event_code": "BW-170",
	"Interest_area": "",
	"Start_time": "9:30 AM",
	"End_time": "10:30 AM",
	"Session_type": "General information session",
	"all_day_evt": false,
	"clash": "This clashes with another session"
}, {
	"Event_code": "BW-032",
	"Interest_area": "",
	"Start_time": "9:30 AM",
	"End_time": "10:00 AM",
	"Session_type": "General information session",
	"all_day_evt": false
}, {
	"Event_code": "BW-096",
	"Interest_area": "Media, Communication and creative arts",
	"Start_time": "10:00 AM",
	"End_time": "12:00 PM",
	"Session_type": "Experience",
	"all_day_evt": false
}, {
	"Event_code": "BW-163",
	"Interest_area": "Business",
	"Start_time": "10:00 AM",
	"End_time": "2:00 PM",
	"Session_type": "Experience",
	"all_day_evt": false,
	"clash": "This clashes with another session"
}, {
	"Event_code": "BW-048",
	"Interest_area": "Media, Communication and creative arts",
	"Start_time": "12:00 PM",
	"End_time": "12:30 PM",
	"Session_type": "Experience",
	"all_day_evt": false
}, {
	"Event_code": "BW-128",
	"Interest_area": "Media, Communication and creative arts",
	"Start_time": "12:00 PM",
	"End_time": "12:30 PM",
	"Session_type": "Tour",
	"all_day_evt": false,
	"clash": "This clashes with another session"
}, {
	"Event_code": "BW-018",
	"Interest_area": "Sciences",
	"Start_time": "12:30 PM",
	"End_time": "2:30 PM",
	"Session_type": "Tour",
	"all_day_evt": false,
	"clash": "This clashes with another session"
}, {
	"Event_code": "BW-013",
	"Interest_area": "Sciences, Engineering, Information technology, Architecture and built environment, Environment",
	"Start_time": "12:30 PM",
	"End_time": "1:00 PM",
	"Session_type": "Course information session",
	"all_day_evt": false
}, {
	"Event_code": "BW-039",
	"Interest_area": "Media, Communication and creative arts",
	"Start_time": "1:00 PM",
	"End_time": "1:30 PM",
	"Session_type": "Experience",
	"all_day_evt": false
}, {
	"Event_code": "BW-162",
	"Interest_area": "Education and teaching",
	"Start_time": "1:00 PM",
	"End_time": "1:30 PM",
	"Session_type": "Tour",
	"all_day_evt": false,
	"clash": "This clashes with another session"
}]

    arr.sort((x,y) => y.all_day_evt- x.all_day_evt || ((new Date('1970/01/01 ' + x.Start_time)) - (new Date('1970/01/01 ' + y.Start_time))));

    console.log(arr);

I am looking to do 3 operations on this array ...

  1. Group this array by "all_day_evt" key.
  2. Sort this array within the 'true' subgroup, and 'false' subgroup by 'Start_time'.
  3. Sort if there is a "clash" on 'start_time' ... with the "clashed event" showing up 2nd.

I am not sure how to implement the 3rd condition, any help is very appreciated. Thanks

Sample output shown below - highlighting how the clash events should line up. It should show up so that the event with "clash" key comes 2nd, not first.

For example, events "BW-013" & "BW-018" are clashing at start_time of 12:30 PM. So, 'BW-013' comes first, and then 'BW-018' shows up. Same goes with events 'BW-039' and 'BW-162' as shown in example output below.

[{
        "Event_code": "BW-013",
        "Interest_area": "Sciences, Engineering, Information technology, Architecture and built environment, Environment",
        "Start_time": "12:30 PM",
        "End_time": "1:00 PM",
        "Session_type": "Course information session",
        "all_day_evt": false
    },
    {
        "Event_code": "BW-018",
        "Interest_area": "Sciences",
        "Start_time": "12:30 PM",
        "End_time": "2:30 PM",
        "Session_type": "Tour",
        "all_day_evt": false,
        "clash": "This clashes with another session"
    },
    {
        "Event_code": "BW-039",
        "Interest_area": "Media, Communication and creative arts",
        "Start_time": "1:00 PM",
        "End_time": "1:30 PM",
        "Session_type": "Experience",
        "all_day_evt": false
    }, {
        "Event_code": "BW-162",
        "Interest_area": "Education and teaching",
        "Start_time": "1:00 PM",
        "End_time": "1:30 PM",
        "Session_type": "Tour",
        "all_day_evt": false,
        "clash": "This clashes with another session"
    }
]
12
  • 3
    The third condition seems to be the least of the issues as the sort() logic you haven isn't actually doing anything. Can you give an example of the output you're expecting to achieve Commented Jun 15, 2018 at 8:39
  • 1
    If you only want to know how to do the third one why do you even mention the other 2? Commented Jun 15, 2018 at 8:49
  • 1
    @liam Because all 3 conditions needs to run together. Its an extension of this question. Commented Jun 15, 2018 at 8:52
  • I think is that Liams point is that you're saying that you need to do X, Y and Z, and are asking about Z without even attempting to do X and Y, which should be done first as they will have an effect on Z Commented Jun 15, 2018 at 8:53
  • @RoryMcCrossan ok, I have updated the array, Run the executable to see Condition 1 and Condition 2 in action. Let me know if you have any more questions. Thanks for the downvote though. Commented Jun 15, 2018 at 8:58

1 Answer 1

1

Try following. You need to add additional condition of clash

 var arr = [{"Event_code":"BW-087","Interest_area":"Information technology","Start_time":"9:00 AM","End_time":"3:00 PM","Session_type":"Experience","all_day_evt":true},{"Event_code":"BW-161","Interest_area":"Media, Communication and creative arts","Start_time":"9:00 AM","End_time":"3:00 PM","Session_type":"Experience","all_day_evt":true},{"Event_code":"BW-114","Interest_area":"Nursing and midwifery","Start_time":"9:00 AM","End_time":"3:00 PM","Session_type":"Tour","all_day_evt":true},{"Event_code":"BW-033","Interest_area":"","Start_time":"9:00 AM","End_time":"3:00 PM","Session_type":"General information session","all_day_evt":true},{"Event_code":"BW-115","Interest_area":"Food, Nutrition and dietetics","Start_time":"9:30 AM","End_time":"3:00 PM","Session_type":"Tour","all_day_evt":true},{"Event_code":"BW-060","Interest_area":"Sport","Start_time":"9:30 AM","End_time":"3:00 PM","Session_type":"Tour","all_day_evt":true},{"Event_code":"BW-081","Interest_area":"Information technology","Start_time":"9:00 AM","End_time":"9:30 AM","Session_type":"Course information session","all_day_evt":false},{"Event_code":"BW-170","Interest_area":"","Start_time":"9:30 AM","End_time":"10:30 AM","Session_type":"General information session","all_day_evt":false,"clash":"This clashes with another session"},{"Event_code":"BW-032","Interest_area":"","Start_time":"9:30 AM","End_time":"10:00 AM","Session_type":"General information session","all_day_evt":false},{"Event_code":"BW-096","Interest_area":"Media, Communication and creative arts","Start_time":"10:00 AM","End_time":"12:00 PM","Session_type":"Experience","all_day_evt":false},{"Event_code":"BW-163","Interest_area":"Business","Start_time":"10:00 AM","End_time":"2:00 PM","Session_type":"Experience","all_day_evt":false,"clash":"This clashes with another session"},{"Event_code":"BW-048","Interest_area":"Media, Communication and creative arts","Start_time":"12:00 PM","End_time":"12:30 PM","Session_type":"Experience","all_day_evt":false},{"Event_code":"BW-128","Interest_area":"Media, Communication and creative arts","Start_time":"12:00 PM","End_time":"12:30 PM","Session_type":"Tour","all_day_evt":false,"clash":"This clashes with another session"},{"Event_code":"BW-018","Interest_area":"Sciences","Start_time":"12:30 PM","End_time":"2:30 PM","Session_type":"Tour","all_day_evt":false,"clash":"This clashes with another session"},{"Event_code":"BW-013","Interest_area":"Sciences, Engineering, Information technology, Architecture and built environment, Environment","Start_time":"12:30 PM","End_time":"1:00 PM","Session_type":"Course information session","all_day_evt":false},{"Event_code":"BW-039","Interest_area":"Media, Communication and creative arts","Start_time":"1:00 PM","End_time":"1:30 PM","Session_type":"Experience","all_day_evt":false},{"Event_code":"BW-162","Interest_area":"Education and teaching","Start_time":"1:00 PM","End_time":"1:30 PM","Session_type":"Tour","all_day_evt":false,"clash":"This clashes with another session"}];
arr.sort((x,y) => y.all_day_evt- x.all_day_evt || ((new Date('1970/01/01 ' + x.Start_time)) - (new Date('1970/01/01 ' + y.Start_time))) || Boolean(x.clash) - Boolean(y.clash));
console.log(arr);

Sign up to request clarification or add additional context in comments.

1 Comment

Perfect @NikhilAggarwal, That's what I was looking for -- the Boolean condition. Can't believe these down-voters. They kept down-voting without even understating the problem. Anyway, I really appreciate all your help. Thanks so much.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.