Javascript运行时优化数组修改
我在优化代码的运行时时时遇到问题。理想情况下,我试图实现的是在一个循环中执行下面的所有操作,这样我就不必像现在这样多次运行数据集(非常大的数据集!) 代码正在将aggData转换为以下格式的数组:[0:0,1:0,2:0,3:43,4:121,5:0,…],其中每个数字表示间隔中的一年,如果间隔为(1800-2020),0表示1800的计数,1表示1801,依此类推 aggData是以下格式的对象数组: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
{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,
});
}
}