该代码使用 JavaScript 函数 formatMedicationData 对药品数据进行格式化。函数接受一个包含多个药品信息的数组 medications 作为参数,并返回一个包含格式化后的药品信息的数组。

代码的主要逻辑如下:

  1. 将 medications 中的每个药品信息转换为一个对象,并将所有对象存入一个新的数组 records 中。

  2. 将 records 中 solvent 属性值为 true 和 false 的对象分别存入两个新的数组 solventTrueRecords 和 solventFalseRecords 中。

  3. 使用 reduce 函数对 solventTrueRecords 和 solventFalseRecords 数组进行遍历,并将每个对象的信息存入一个新的对象中。该对象以药品名称作为 key,以日期作为 value,每个日期对应一个包含药品信息的子对象。

  4. 在遍历过程中,如果当前药品在新的对象中不存在,则创建一个空对象。如果当前药品对应的日期在新的对象中不存在,则创建一个空对象,以便实现日期占位。

  5. 最后,将所有格式化后的药品信息合并到一个新的数组中,并返回。

function formatMedicationData(medications) {
  const records = Object.values(medications).flat()
  const solventTrueRecords = records.filter((record) => record.solvent === true)
  const solventFalseRecords = records.filter((record) => record.solvent === false)
  const processRecord = (acc, medication) => {
    const {
      medicationDate,
      medicineName,
      dosage,
      orderClass,
      orderType,
      specification,
      routeOfAdministration,
      frequency,
      doctor,
      action,
      solvent
    } = medication
    const date = medicationDate.split(' ')[0]
    const medicationInfo = acc[medicineName]?.[date]?.medicationInfo || medication.medicationInfo
    const medicineType = acc[medicineName]?.[date]?.medicineType || medication.medicineType
    const orderClassVal = acc[medicineName]?.[date]?.orderClass || medication.orderClass
    const orderTypeVal = acc[medicineName]?.[date]?.orderType || medication.orderType
    const specificationVal = acc[medicineName]?.[date]?.specification || medication.specification
    const dosageUnitVal = acc[medicineName]?.[date]?.dosageUnit || medication.dosageUnit
    const routeOfAdministrationVal =
      acc[medicineName]?.[date]?.routeOfAdministration || medication.routeOfAdministration
    const frequencyVal = acc[medicineName]?.[date]?.frequency || medication.frequency
    const doctorVal = acc[medicineName]?.[date]?.doctor || medication.doctor
    const actionVal = acc[medicineName]?.[date]?.action || medication.action
    const hour = Number(medicationDate.split(' ')[1].split(':')[0])
    const timeOfDay = hour >= 6 && hour < 12 ? 'morning' : hour >= 12 && hour < 18 ? 'nooning' : 'evening'
    const medicationInfoObj = {
      medicationInfo,
      medicineType,
      orderClass: orderClassVal,
      orderType: orderTypeVal,
      specification: specificationVal,
      dosageUnit: dosageUnitVal,
      routeOfAdministration: routeOfAdministrationVal,
      frequency: frequencyVal,
      doctor: doctorVal,
      action: actionVal,
      morning: acc[medicineName]?.[date]?.morning || 0,
      nooning: acc[medicineName]?.[date]?.nooning || 0,
      evening: acc[medicineName]?.[date]?.evening || 0,
      [timeOfDay]: (acc[medicineName]?.[date]?.[timeOfDay] || 0) + dosage
    }
    if (!acc[medicineName]) {
      acc[medicineName] = {}
    }
    if (!acc[medicineName][date]) {
      acc[medicineName][date] = {}
    }
    acc[medicineName][date] = { ...acc[medicineName][date], ...medicationInfoObj }
    return acc
  }
  const resultsTrue = solventTrueRecords.reduce(processRecord, {})
  const resultsFalse = solventFalseRecords.reduce(processRecord, {})
  const finalResultsTrue = Object.entries(resultsTrue).map(([medicineName, dates]) => ({
    medicineName,
    ...dates,
    solvent: true
  }))
  const finalResultsFalse = Object.entries(resultsFalse).map(([medicineName, dates]) => ({
    medicineName,
    ...dates,
    solvent: false
  }))
  console.log(finalResultsTrue)
  console.log(finalResultsFalse)
  return [...finalResultsTrue, ...finalResultsFalse]
}
formatMedicationData(tableBodyData1.value)

这段代码实现了每个药品对应日期占位的功能,即使该药品没有对应的数据。具体来说,代码在 processRecord 函数中加入了两个判断:

  • 如果 acc[medicineName] 不存在,就初始化为一个空对象。
  • 如果 acc[medicineName][date] 不存在,就将其初始化为一个空对象。

这样就可以确保每个药品都有对应的日期,即使该药品没有对应的数据,也会创建一个空对象作为占位符。

需要注意的是,这段代码中使用了 Object.values() 和 flat() 方法,用于将嵌套的数组转换为一个一维数组。此外,代码中还使用了 reduce() 方法对数组进行遍历和累加,并使用了 map() 方法对对象进行映射。

这段代码可以帮助你快速地将药品数据格式化为一个易于理解和操作的对象。

JavaScript 药品数据格式化:实现每个药品对应日期占位

原文地址: https://www.cveoy.top/t/topic/oUN6 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录