{"ScriptPreparationCode":"function Rand(x) {\r\n return Math.floor(Math.random() * x);\r\n}\r\n\r\nconst arr = R.map(x =\u003E { return {room: {name: Rand(x)}, structureType: Rand(x)}; }, R.repeat(30, 10000));\r\n\r\nfunction GetArray() { return arr; }\r\n\r\nfunction SortMyStructs()\r\n{\r\n Game = {};\r\n \tGame.structures = GetArray();\r\n\r\n Game.mStructs = { };\r\n Game.mStructs.mRooms = { };\r\n Game.mObservers = [ ];\r\n\r\n for (let structIter in Game.structures)\r\n {\r\n const structure = Game.structures[structIter];\r\n const roomName = structure.room.name;\r\n const type = structure.structureType;\r\n\r\n if (undefined === Game.mStructs.mRooms[roomName])\r\n {\r\n Game.mStructs.mRooms[roomName] = { };\r\n Game.mStructs.mRooms[roomName].mAll = [ ];\r\n Game.mStructs.mRooms[roomName].mType = { };\r\n }\r\n\r\n Game.mStructs.mRooms[roomName].mAll.push(structure);\r\n\r\n if (undefined === Game.mStructs.mRooms[roomName].mType[type])\r\n {\r\n Game.mStructs.mRooms[roomName].mType[type] = [ ];\r\n }\r\n\r\n Game.mStructs.mRooms[roomName].mType[type].push(structure);\r\n }\r\n};","TestCases":[{"Name":"Lodash groupBy","Code":"const tmp = _.groupBy(GetArray(), x =\u003E x.room.name);\r\nconst tmp2 = _.forEach(tmp, (val, key) =\u003E tmp[key] = _.groupBy(tmp[key], x =\u003E x.structureType));\r\ntmp2;","IsDeferred":false},{"Name":"Ramda groupBy","Code":"R.pipe(\r\n \tR.groupBy(x =\u003E x.room.name),\r\n \tR.map(R.groupBy(x =\u003E x.structureType))\r\n )(GetArray());","IsDeferred":false},{"Name":"Hand written","Code":"SortMyStructs();","IsDeferred":false},{"Name":"Using Reduce","Code":"_.reduce(GetArray(),\r\n (acc, x) =\u003E {\r\n \t\t\tif (!acc.mRooms) acc.mRooms = {};\r\n \r\n if (!acc.mRooms[x.room.name]) acc.mRooms[x.room.name] = {mAll: [], mType: {}};\r\n acc.mRooms[x.room.name].mAll.push(x);\r\n \r\n if (!acc.mRooms[x.room.name].mType[x.structureType]) acc.mRooms[x.room.name].mType[x.structureType] = [];\r\n acc.mRooms[x.room.name].mType[x.structureType].push(x);\r\n \r\n return acc;\r\n },\r\n {});","IsDeferred":false}]}