У меня есть 2 функции, одна работает, а другая нет - причина, по которой вторая функция важнее, состоит в том, что я хочу изменить то, что находится в конечном массиве.Деконструкция великолепна, и все, но я не ожидаю, что одна и та же посадка входящих данных будет в одном месте - в другом месте я исправил эту проблему, создав отдельные массивы и просто заставив все мои функции возвращать данные по индексу, но я немного ошеломленздесь.
Вот первый (createLogs), который делает то, что я хочу, и если бы данные всегда поступали одинаково, было бы более чем достаточно.
function createLogs(array,runtimeArray) {
let basicsLog=[]
array.map(function callback(currentValue,index) {
let currentRuntime = runtimeArray[index]
let [,date,time,systemMode,systemSetting,calEvent,ProgramMode,coolSetTemp,heatSetTemp,currentTemp] = currentValue
basicsLog.push([index,date,time,systemMode,systemSetting,calEvent,ProgramMode,coolSetTemp,heatSetTemp,currentTemp,currentRuntime])
})
console.log(basicsLog)
return basicsLog
}
Возвращает
[ 36,
2018-11-19T05:00:00.000Z,
'second failure',
'heat',
'heatOff',
'hold',
'Sleep',
70,
70,
69.5,
135 ],
[ 37,
2018-11-19T05:00:00.000Z,
'2:35:00',
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
null ] ]
Теперь вот createResults () - я думаю, что гораздо лучше для ситуации, когда то, что входит, сильно изменчиво (в основном это таблица, а столбцы втаблица различна в разных ситуациях)
createResults () выглядит следующим образом:
function createResults(originalThermostatArray,dateArray,timeArray, systemSettingsArray, systemModeArray, calendarEventArray, programModeArray, coolSetTempArray, heatSetTempArray, currentTempArray, thermostatTempArray, outdoorTempArray, combinedRuntimesArray) {
let resultArray = []
originalThermostatArray.forEach(function(currentValue,index) {
let currentDate = dateArray[index]
let currentTime = timeArray[index]
let currentSystemSetting = systemSettingsArray[index]
let currentSystemMode = systemModeArray[index]
let currentCalEvent = calendarEventArray[index]
let currentProgramMode = programModeArray[index]
let currentCoolSetTemp = coolSetTempArray[index]
let currentHeatSetTemp = heatSetTempArray[index]
let currentAvgTemp = currentTempArray[index]
let currentThermostatTemp = thermostatTempArray[index]
let currentOutdoorTemp = outdoorTempArray[index]
let currentRuntime = combinedRuntimesArray[index]
resultArray.push([index, currentDate, currentTime, currentSystemSetting, currentSystemMode, currentCalEvent,currentProgramMode, currentCoolSetTemp, currentHeatSetTemp, currentAvgTemp, currentThermostatTemp, currentOutdoorTemp, currentRuntime])
})
console.log(resultArray)
return resultArray
}
And Returns
[ 36,
2018-11-19T05:00:00.000Z,
'second failure',
'heat',
'heatOff',
'hold',
'Sleep',
70,
70,
69.5,
69.5,
23.5,
135 ],
[ 37,
2018-11-19T05:00:00.000Z,
'2:35:00',
null,
null,
null,
null,
null,
null,
null,
null,
23.5,
null ] ]
На внешнем интерфейсе код выглядит следующим образом
div.resultSummaries.equipmentSummary
h1.summaryHeader.equipmentSummaryHead Possible Equipment Failures
h3.equipmentSummaryBody #{equipresultCount}
p.equipmentSummaryBody This table looks for increasing thermostat temperatures during a cooling call.
table.fullResults.equipmentResultsTable
caption.equipTitle Possible Equipment Failures Log
thead
tr
th.resultHeader.equipmentHeader Index
th.resultHeader.equipmentHeader Date
th.resultHeader.equipmentHeader Time
th.resultHeader.equipmentHeader System Setting
th.resultHeader.equipmentHeader System Mode
th.resultHeader.equipmentHeader Calendar Event
th.resultHeader.equipmentHeader Program Mode
th.resultHeader.equipmentHeader Cool Set Temp
th.resultHeader.equipmentHeader Heat Set Temp
th.resultHeader.equipmentHeader Avg Temp
th.resultHeader.equipmentHeader Thermostat Temp
th.resultHeader.equipmentHeader Outdoor Temp
th.resultHeader.equipmentHeader Runtime(sec)
tr
tbody
- let equipFailsResultLog = result.equipLogs;
for item in equipFailsResultLog
tr.equipRow
for item in equipArray
td.resultTable.result.equipResult #{item}
tfoot
Но createResults () возвращает эту ошибку во внешнем интерфейсе:
/views/upload.pug:137 135| for item in equipFailsResultLog 136| tr.equipRow > 137| for item in equipArray 138| td.resultTable.result.equipResult #{item} 139| tfoot 140| Cannot read property 'length' of undefined.
Я думаю, что тот факт, что они возвращаются по-разному, вызывает ошибку, но почему?обратите внимание, что я пытался написать createResults () как a для каждого, а карта
function1 (createlogs) позволяет мне войти в массив и получить доступ к отдельным элементам и правильно разместить их
function2 (createResults) не ..
Как я могу получить доступ к вложенным элементам с помощью функции 2 или отобразить их так, как я хотел бы?
добавлено:
создание результатов называется какэтот
const basicLogsArray = returnLogic.createResult(originalThermostatArray,dateArray,timeArray,systemSettingsArray,systemModeArray,calendarEventArray,programModeArray,coolSetTempArray,heatSetTempArray,currentTempArray,thermostatTempArray,outdoorTempArray,combinedRuntimesArray)
создать журнал вызывается аналогично, но только с массивом и массивом времени выполнения.
const equipFailsLogs = reportLogic.rowsByIndex(
basicLogsArray,
possibleEquipmentFailuresArray
)
console.log(equipFailsLogs)
Это то, что идет в интерфейс.(Я запускаю другую функцию, чтобы получить всю строку, с которой связан каждый бит даты, и вернуть ее в виде таблицы html в pug.
return {
"Results": {
"coolCount":coolFailsRows.length/2 , coolLogs:coolFailsLogs,
"heatCount":heatFailsRows.length/2 , heatLogs:heatFailsLogs,
"miscCount":miscFailsRows.length/2 , miscLogs:miscfailsLogs,
"equipCount":equipFailsLogs.length/4 , equipLogs:equipFailsLogs,
}};
}
exports.runThermostat = runThermostat