优化函数迭代每次都要查找的代码

在做Perfeye需求的时候,有写了一个函数,每次遍历,要根据相同的时间,把对应的数据整合

刚开始用findIndex 进行每次查找,但是性能很差,后面问了gpt有没有什么操作能不用findIndex,gpt说可以单独存储时间索引值来进行判断

旧代码

const getFTimeDataSetSourceData = () => {
    const result: { [x: string]: number; }[] = []
    //Todo 等待优化
    // 遍历 caseInfoList 中的每个 case
    for (const caseInfo of caseInfoList) {
      const caseData = caseInfo.dataList;
      const dimensionName = caseInfo.dimensionName;
      caseData.forEach(item => {
        const len = item.FTime?.length || 0;
        const splitTime = 1000 / len;
        item.FTime?.forEach((t, idx) => {
          const _time = item.time + round(idx * splitTime)
          const _timeIndex = result.findIndex(item => item.time === _time)
          if (_timeIndex === -1) {
            result.push({
              time: _time,
              [dimensionName]: t
            })
          } else {
            result[_timeIndex][dimensionName] = t
          }
        })
      });

    }
    return result
  }

新代码

const getFTimeDataSetSourceData = useMemoizedFn(() => {
    const result: { [x: string]: number; }[] = []
    const timeIndexMap: { [x: number]: number; } = {}; // 存储时间索引的对象

    for (const caseInfo of caseInfoList) {
      const caseData = caseInfo.dataList;
      const dimensionName = caseInfo.dimensionName;
      caseData.forEach(item => {
        const len = item.FTime?.length || 0;
        const splitTime = 1000 / len;
        item.FTime?.forEach((t, idx) => {
          const _time = item.time + round(idx * splitTime)
          if (timeIndexMap[_time] === undefined) {
            // 时间索引不存在,将其添加到结果数组中,并更新时间索引对象
            result.push({
              time: _time,
              [dimensionName]: t
            });
            timeIndexMap[_time] = result.length - 1;
          } else {
            // 时间索引已存在,直接更新结果数组中对应的值
            result[timeIndexMap[_time]][dimensionName] = t;
          }
        })
      });

    }
    return result
  })

今日问gpt,又学到了一招

posted @ 2023-09-01 18:51  彼_岸  阅读(0)  评论(0编辑  收藏  举报