{"ScriptPreparationCode":"var arr = [{\u0022id\u0022:\u00225c3daf0b31cdc200074fc122\u0022,\u0022name\u0022:\u0022~!@#$%^\u0026*()_\u002B\u0060-=,.\\/;\u0027\\\\[]:\\\u0022|\u003C\u003E?{}\u0022,\u0022state\u0022:\u0022prelive\u0022,\u0022layout\u0022:{\u0022interactivity\u0022:\u0022none\u0022},\u0022startDate\u0022:1547546400000,\u0022duration\u0022:60,\u0022archived\u0022:false,\u0022securityData\u0022:{\u0022registrationAccess\u0022:false},\u0022theme\u0022:{\u0022id\u0022:\u00225c330dbf31cdc2002a00f5e9\u0022,\u0022name\u0022:\u0022Theme Example (1)\u0022,\u0022logoFileUrl\u0022:null,\u0022faviconFileUrl\u0022:null,\u0022audioOnlyFileUrl\u0022:null}},{\u0022id\u0022:\u00225c330dbf31cdc2002a00f5ee\u0022,\u0022name\u0022:\u0022Webcast Example (1)\u0022,\u0022state\u0022:\u0022prelive\u0022,\u0022layout\u0022:{\u0022interactivity\u0022:\u0022none\u0022},\u0022startDate\u0022:4143180000,\u0022archived\u0022:false,\u0022securityData\u0022:{\u0022registrationAccess\u0022:false},\u0022theme\u0022:{\u0022id\u0022:\u00225c330dbf31cdc2002a00f5e9\u0022,\u0022name\u0022:\u0022Theme Example (1)\u0022,\u0022logoFileUrl\u0022:null,\u0022faviconFileUrl\u0022:null,\u0022audioOnlyFileUrl\u0022:null}},{\u0022id\u0022:\u00225c330dbf31cdc2002a00f5f4\u0022,\u0022name\u0022:\u0022Webcast Example (2)\u0022,\u0022state\u0022:\u0022live\u0022,\u0022layout\u0022:{\u0022interactivity\u0022:\u0022none\u0022},\u0022startDate\u0022:1465196400,\u0022archived\u0022:false,\u0022securityData\u0022:{\u0022registrationAccess\u0022:false},\u0022theme\u0022:{\u0022id\u0022:\u00225c330dbf31cdc2002a00f5ea\u0022,\u0022name\u0022:\u0022Theme Example (2)\u0022,\u0022logoFileUrl\u0022:null,\u0022faviconFileUrl\u0022:null,\u0022audioOnlyFileUrl\u0022:null}},{\u0022id\u0022:\u00225c330dbf31cdc2002a00f5f5\u0022,\u0022name\u0022:\u0022Webcast Example (3)\u0022,\u0022state\u0022:\u0022postlive\u0022,\u0022layout\u0022:{\u0022interactivity\u0022:\u0022none\u0022},\u0022startDate\u0022:1456260000,\u0022archived\u0022:false,\u0022securityData\u0022:{\u0022registrationAccess\u0022:false},\u0022theme\u0022:{\u0022id\u0022:\u00225c330dbf31cdc2002a00f5eb\u0022,\u0022name\u0022:\u0022Theme Example (3)\u0022,\u0022logoFileUrl\u0022:null,\u0022faviconFileUrl\u0022:null,\u0022audioOnlyFileUrl\u0022:null}}];","TestCases":[{"Name":"lodash","Code":" let sortedByYears = sortListByDate(arr, \u0027YYYY\u0027, \u0027year\u0027);\r\n\r\n _.map(sortedByYears, (byYearItem) =\u003E ({\r\n year: byYearItem.year,\r\n months: sortListByDate(byYearItem.webcasts, \u0027MMMM\u0027, \u0027month\u0027)\r\n })\r\n );\r\n \r\n\r\n function sortListByDate(list, dateFormat, newProp) {\r\n const sortByYears = sortByDateFormat(list, dateFormat)\r\n .map(mappingBydate(dateFormat, newProp));\r\n\r\n return _.chain(sortByYears)\r\n .groupBy(newProp)\r\n .map((webcasts, propName) =\u003E ({ [newProp]: propName, webcasts }))\r\n .reverse()\r\n .value();\r\n }\r\n\r\n function dateFormatter(format) {\r\n return (webcast) =\u003E moment(webcast.startDate).format(format);\r\n }\r\n\r\n function mappingBydate(format, name) {\r\n return (webcast) =\u003E ({ ...webcast, [name]: dateFormatter(format)(webcast) });\r\n }\r\n\r\n function sortByDateFormat(list, format) {\r\n return _.sortBy(list, dateFormatter(format));\r\n }","IsDeferred":false},{"Name":"native","Code":" const result = [];\r\n let currentYear;\r\n let currentYearIndex = -1;\r\n let currentMonth;\r\n let currentMonthIndex = -1;\r\n\r\n arr.forEach((webcast) =\u003E {\r\n const year = moment(webcast.startDate).format(\u0027YYYY\u0027);\r\n const month = moment(webcast.startDate).format(\u0027MMMM\u0027);\r\n\r\n if (!currentYear || year !== currentYear[\u0027year\u0027]) {\r\n currentYearIndex\u002B\u002B;\r\n currentYear = { year, \u0027months\u0027: {} };\r\n result[currentYearIndex] = currentYear;\r\n }\r\n\r\n if (!currentMonth || month !== currentMonth[\u0027month\u0027]) {\r\n currentMonthIndex\u002B\u002B;\r\n currentMonth = { month, \u0027webcasts\u0027: [] };\r\n currentYear[\u0027months\u0027][currentMonthIndex] = currentMonth;\r\n }\r\n\r\n currentMonth[\u0027webcasts\u0027].push(webcast);\r\n });","IsDeferred":false}]}