我正在构建一个表,用于显示与一个月中特定日期相关联的用户小时数.由于每个月有不同的日期,因此列是动态设置的.我很好地掌握了它的 struct ,根据所选的月份和年份,表头显示了适当的天数.我有api提取的数据并显示出来,但是我完全不知道如何将数据中的日期与列中的日期进行匹配.

我制作了一个简化的代码Sandbox ,显示了我的位置:

更复杂的是,我在实际应用程序中使用的数据有两个日期对象,一个是开始时间,一个是结束时间.一般来说,时间不应跨越几天,但这可能发生.对于这个表,我想我可以从一个日期对象中提取日期(这就是为什么Sandbox 只有一个开始字段).

我已经考虑过try 实现以下功能

setDataDates(
   const dataDay = new Date(data.start).getDate()

但我完全不知道如何才能在正确的日期进行访问.非常感谢您的指导,谢谢!

UPDATE

然而,实际功能仍然不存在

import "./styles.css";
import React from "react";

export default function App() {
  const data = [
    {
      start: "2022-04-02",
      hours: 2
    },
    {
      start: "2022-04-06",
      hours: 3
    },
    {
      start: "2022-04-11",
      hours: 1
    }
  ];
  const [newData, setNewData] = React.useState();

  const setDataforTable = () => {
    const oldData = data.map((data) => ({
      day: new Date(data.start).getDate(),
      hours: data.hours
    }));
    console.log("newData", oldData);
    setNewData(oldData);
  };

  const [days, setDays] = React.useState([]);

  const settingDays = () => {
    const daysInMonth = 30;

    let dayInfo = [];
    for (let i = 1; i <= daysInMonth; i++) {
      dayInfo.push(i);

     let result = dayInfo.map((i) => (
       {
        day: i
      }
      ));
      console.log("day ", result);
      setDays(result);
      
    }
  };

  const totalHours = data.map((i) => i.hours).reduce((a, b) => a + b, 0);

  let tableDisplay;


  if (days !== []) {
    
    tableDisplay = (
      <div>
        <table>
          <thead>
            <tr>
              <th> Date </th>
              {days && days.map((day) => <th key={day}>{day.day}</th>)}
              <th>Total Hours</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Hours</td>
              {newData && newData.map((d) => 
              <td key={d.day}>{d.day === days.day ? d.hours : 0}</td>
              )}
              <td>{totalHours}</td>
            </tr>
          </tbody>
        </table>
      </div>
    );
  }

  return (
    <div>
      <button
        onClick={() => {
          setDataforTable(), settingDays();
        }}
      >
        Click
      </button>
      {tableDisplay}
    </div>
  );
}

推荐答案

所以,这是可行的解决方案,您可以通过进行一些更改来实现您想要的.此解决方案尚未完全优化,但您会明白的.

因此,为了获得结果,您必须创建一个具有实际日期编号的新数据数组,以便稍后我们可以使用它来过滤dayArr.之后,您必须映射对象的day数组,并判断day是否与数据数组中的day匹配,如果匹配,则替换小时数.

import "./styles.css";
import React from "react";

export default function App() {
  const data = [
    {
      start: "2022-04-02",
      hours: 2
    },
    {
      start: "2022-04-06",
      hours: 3
    },
    {
      start: "2022-04-11",
      hours: 1
    }
  ];


  // filter the data so we can have actual day number
  const filteredData = data.map((item) => {
    const splitDate = item.start.split("-");
    const day = splitDate[splitDate.length - 1];

    return {
      start: parseInt(day),
      hours: item.hours
    };
  });


  const [newData, setNewData] = React.useState();

  const setDataforTable = () => {
    const dataDays = data.map((data) => ({
      day: new Date(data.start).getDate(),
      hours: data.hours
    }));

    setNewData(dataDays);
  };

  const [days, setDays] = React.useState([]);

  const settingDays = () => {
    const daysInMonth = 30;

    let dayInfo = [];
    for (let i = 1; i <= daysInMonth; i++) {
      dayInfo.push(i)

      // create an array and fill hours with 0
      const dayArr = dayInfo.map((day) => ({
        day: day,
        hours: 0
      }));


      // map over dayArr and replace the hours 
      let temp = [...dayArr];
      dayArr.map((i, idx) => {
        const getHours = filteredData.filter((item) => item.start === i.day);
        if (getHours.length) {
          const newData = {
            day: i.day,
            hours: getHours[0].hours
          };
          temp[idx] = newData;
        }
      });

      setDays(temp);
    }
  };

  const totalHours = data.map((i) => i.hours).reduce((a, b) => a + b, 0);

  let tableDisplay;


  if (days.length) {
    //convertData();
    tableDisplay = (
      <div>
        <table>
          <thead>
            <tr>
              <th> Date </th>
              {days.map((i) => (
                <th key={i}>{i?.day}</th>
              ))}
              <th>Total Hours</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Hours</td>
              {/* {newData &&
                
              } */}
              {days && days.map((d) => <td>{d.hours}</td>)}
              <td>{totalHours}</td>
            </tr>
          </tbody>
        </table>
      </div>
    );
  }

  return (
    <div>
      <button
        onClick={() => {
          setDataforTable();
          settingDays();
        }}
      >
        Click
      </button>
      {tableDisplay}
    </div>
  );
}

Javascript相关问答推荐

单击子元素时关闭父元素(JS)

我可以从React中的出口从主布局调用一个处理程序函数吗?

在这种情况下,如何 for each 元素添加id?

当Redux提供程序访问Reduxstore 时,可以安全地从Redux提供程序外部调用钩子?

无法从NextJS组件传递函数作为参数'

用于编辑CSS样式的Java脚本

在forEach循环中获取目标而不是父对象的属性

React.Development.js和未捕获的ReferenceError:未定义useState

Puppeteer上每页的useProxy返回的不是函数/构造函数

Nextjs 13.4 Next-Auth 4.2登录(&Quot;凭据&,{});不工作

<;img>;标记无法呈现图像

如果没有页面重新加载Angular ,innerHTML属性绑定不会更新

警告框不显示包含HTML输入字段的总和

如何为仅有数据可用的点显示X轴标签?

JavaScript:如果字符串不是A或B,则

select 2-删除js插入的项目将其保留为选项

MUI迷你图:如何将$符号添加到MUI迷你图中的工具提示数据

将延迟加载的模块转换为Eager 加载的模块

Js问题:有没有办法将数据从标记表转换成图表?

如何让noWrap在嵌套在Alert/AlertTitle组件中的排版组件中工作?