{"ScriptPreparationCode":"var LIST_OSCILLATION_STATE = { 6: [6, 7] }\r\nvar DATE_KEY = \u0027dateTime\u0027\r\nvar data = []\r\n\r\nlet id = Math.floor(Math.random() * 5)\r\nlet nextIdChange = Math.round(Math.random() * 170 \u002B 30)\r\nfor (let i = 0; i \u003C 2000; i\u002B\u002B) {\r\n if (i \u003E= nextIdChange) {\r\n id = Math.floor(Math.random() * 5)\r\n nextIdChange = Math.round(Math.random() * 170 \u002B 30)\r\n }\r\n const wellDepth = Math.random() * 5000\r\n const dateTime = new Date(Math.round(Date.now() * Math.random())).toISOString()\r\n data.push({ dateTime, wellDepth, idFeedRegulator: id, state: id \u002B 4 })\r\n}\r\n\r\nvar makeLimit = (id, dateTime, depth) =\u003E ({\r\n id,\r\n dateStart: dateTime,\r\n dateEnd: dateTime,\r\n depthStart: depth,\r\n depthEnd: depth,\r\n})","TestCases":[{"Name":"Before optimization","Code":"const getLimitsFromData = (data, accessorName) =\u003E {\r\n if (data.length \u003C 1) return []\r\n\r\n const out = []\r\n for (let i = 0; i \u003C data.length; i\u002B\u002B) {\r\n if (!data[i][accessorName] || !data[i][DATE_KEY]) continue\r\n\r\n const lastLimit = out?.[out.length - 1]\r\n let { [accessorName]: id, [DATE_KEY]: dateTime, wellDepth = null } = data[i]\r\n\r\n if (accessorName === \u0027state\u0027)\r\n for (const [key, states] of Object.entries(LIST_OSCILLATION_STATE))\r\n if (states.includes(id))\r\n id = Number(key)\r\n\r\n const newDateTime = new Date(dateTime)\r\n\r\n if (lastLimit \u0026\u0026 lastLimit.id === id) {\r\n lastLimit.dateEnd = newDateTime\r\n lastLimit.depthEnd = wellDepth\r\n } else {\r\n out.push(makeLimit(id, newDateTime, wellDepth))\r\n }\r\n }\r\n\r\n return out\r\n}\r\n\r\nconst saubLimitData = getLimitsFromData(data, \u0027idFeedRegulator\u0027)\r\nconst spinLimitData = getLimitsFromData(data, \u0027state\u0027)\r\n","IsDeferred":false},{"Name":"After optimization","Code":"const getLimitsFromData = (data, accessorName, parseId) =\u003E {\r\n if (data.length \u003C 1) return []\r\n\r\n const out = []\r\n for (let i = 0; i \u003C data.length; i\u002B\u002B) {\r\n if (!data || !data[i][accessorName] || !data[i][DATE_KEY]) continue\r\n\r\n const lastLimit = out[out.length - 1]\r\n let { [accessorName]: id, [DATE_KEY]: dateTime, wellDepth = null } = data[i]\r\n\r\n if (typeof parseId === \u0027function\u0027)\r\n id = parseId(id)\r\n \r\n const newDateTime = new Date(dateTime)\r\n\r\n if (lastLimit?.id === id) {\r\n lastLimit.dateEnd = newDateTime\r\n lastLimit.depthEnd = wellDepth\r\n continue\r\n }\r\n\r\n out.push(makeLimit(id, newDateTime, wellDepth))\r\n }\r\n\r\n return out\r\n}\r\n\r\nconst saubLimitData = getLimitsFromData(data, \u0027idFeedRegulator\u0027)\r\nconst spinLimitData = getLimitsFromData(data, \u0027state\u0027,\r\n (id) =\u003E Number(Object.keys(LIST_OSCILLATION_STATE).find((key) =\u003E LIST_OSCILLATION_STATE[key].includes(id)) ?? id))\r\n","IsDeferred":false}]}