Javascript运行时优化数组修改

Javascript运行时优化数组修改,javascript,arrays,optimization,Javascript,Arrays,Optimization,我在优化代码的运行时时时遇到问题。理想情况下,我试图实现的是在一个循环中执行下面的所有操作,这样我就不必像现在这样多次运行数据集(非常大的数据集!) 代码正在将aggData转换为以下格式的数组:[0:0,1:0,2:0,3:43,4:121,5:0,…],其中每个数字表示间隔中的一年,如果间隔为(1800-2020),0表示1800的计数,1表示1801,依此类推 aggData是以下格式的对象数组:{key\u as\u string:“1900-01-01T00:00:00.000Z”,k

我在优化代码的运行时时时遇到问题。理想情况下,我试图实现的是在一个循环中执行下面的所有操作,这样我就不必像现在这样多次运行数据集(非常大的数据集!)

代码正在将aggData转换为以下格式的数组:[0:0,1:0,2:0,3:43,4:121,5:0,…],其中每个数字表示间隔中的一年,如果间隔为(1800-2020),0表示1800的计数,1表示1801,依此类推

aggData是以下格式的对象数组:
{key\u as\u string:“1900-01-01T00:00:00.000Z”,key:-2208988800000,doc\u count:17}
。起始年是文档计数大于0的第一年

下面,我将描述每个步骤现在的代码:

在这里,我将列表中每个对象的格式更改为:{year:number,count:number}

 const formatAggData = aggData
        .map((item: AggData) => {
            return { year: moment(item.key_as_string).year(), count: item.doc_count };
        });
此函数创建一个对象数组,起始年为起始年,结束年为结束年,如果该年已存在于现有数组中,则使用该数组中的计数,如果不存在,则将计数设置为0

    function fillYears(from: number, to: number, existingArray: YearCount[]) {
        const existingObject: { [year: string]: number } = { year: null };
        existingArray.map((x: YearCount) => (existingObject[x.year] = x.count));

        const yearsArray = [];
        for (let i = from; i <= to; i++) {
            yearsArray.push({
                year: i,
                count: existingObject[i] || 0,
            });
        }

        return yearsArray;
    }

我在看你的密码。你不能这样做吗?看起来你现在不需要知道年份

function fillYears(from: number, to:number, existingYears: YearCount[]) {
    for (let i = from; i <= to; i++) {
      yearsArray.push({
          year: i,
          count: existingYears[i].doc_count || 0,
      });
  }
}
函数fillYears(from:number,to:number,existingYears:YearCount[]){

对于(让i=from;i“非常大的数据集!”-数据来自哪里?代码中的哪一部分实际上是缓慢的操作(您分析过它了吗)?而且看起来您的数据集从来没有超过220个项目(1800年到2020年),所以这不是“大的”。数据是按年份排序的吗?在这种情况下,您根本不需要使用现有对象查找。很抱歉,没有提供足够的详细信息!数据是从ElasticSearch日期直方图聚合返回的,是的,数据是按年份排序的。@BergiYes,您是对的!非常感谢!我唯一需要更改的是:count:existingArray[i-from]?.count | | 0(因为from参数是year,而不是从0开始)
function fillYears(from: number, to:number, existingYears: YearCount[]) {
    for (let i = from; i <= to; i++) {
      yearsArray.push({
          year: i,
          count: existingYears[i].doc_count || 0,
      });
  }
}