JavaScript数组-高效地计算给定间隔内的平均值

JavaScript数组-高效地计算给定间隔内的平均值,javascript,arrays,algorithm,average,Javascript,Arrays,Algorithm,Average,我有两个数组,一个表示数据,另一个表示间隔。两者都已排序,且其起始值和结束值匹配。我通过嵌套for循环来计算给定间隔内数据点的平均值。结果,每个间隔都有一个数据值。对于较小尺寸的阵列,

我有两个数组,一个表示数据,另一个表示间隔。两者都已排序,且其起始值和结束值匹配。我通过嵌套for循环来计算给定间隔内数据点的平均值。结果,每个间隔都有一个数据值。对于较小尺寸的阵列,<100-500长度,这些线性回路可以完成工作,但是,这种方法对于数千个数据点成为一个问题。如有任何建议,将不胜感激

请参阅下面的简化代码,最后有一个指向JSFIDLE的链接

var TimelineArray=[0,10,20,30,40,40,60,70,80,90,100],
DataArray=[0,2,4,5,8,11,19,22,24,25,30,31,38,39,51,56,57,58,59,64,74,76,89,91,92,94,98,100],
DataArrayA=[];
对于(i=0;i如果(DataArray[j]>TimelineArray[i]&&DataArray[j]因为数组已排序,您可以根据时间线和数据的大小线性执行此操作:

var timeline=[0,10,20,30,40,40,60,70,80,90,100],
数据=[0,2,4,5,8,11,19,22,24,25,30,31,38,39,51,56,57,58,59,64,74,76,89,91,92,94,98,100];
var平均值=新数组(timeline.length-1);
对于(变量i=0,j=0;i对于(;data[j]不确定它是否会更快,但这里有一条不同的裂缝:

var TimelineArray=[0,10,20,30,40,40,60,70,80,90,100],
DataArray=[0,2,4,5,8,11,19,22,24,25,30,31,38,39,51,56,57,58,59,64,74,76,89,91,92,94,98,100],
DataArrayA=[];
功能平均值(arr){
如果(arr!=null&&arr.length>0)
返回arr.reduce(函数(a,b){returna+b;},0)/arr.length;
返回null;
}
对于(变量i=0;ivar data=DataArray.filter(函数(a){returna>interval[0]&&a您不需要在每次迭代开始时重新扫描
DataArray

var TimelineArray=[0,10,20,30,40,40,60,70,80,90,100];
var DataArray=[0,2,4,5,8,11,19,22,24,25,30,31,38,39,51,56,57,58,59,64,74,76,89,91,92,94,98,100];
var res=[],pos=0;
TimelineArray.forEach(函数(v,i){

对于(var sum=0,n=0;DataArray[pos],如果有帮助的话,我有一个从数组中获取平均值的简单解决方案,还有一个将此类函数添加到数学对象的复杂解决方案?使用
Math.average([0,10,20,30,40,40,60,70,80,90,100])
结果
49.0909
TimelineArray元素之间是否始终具有相同的间隔(在本例中为10)?间隔始终相同,但是,每个间隔的数据点数量会有所不同-从0(例如,示例中一个间隔中的空值)这就是为什么我保留一个临时数组dataPointsInGivenTimeInterval来存储,然后从中计算平均值。我喜欢不在每次迭代开始时扫描整个数据数组的想法。那么结束部分呢?我相信同样的想法也可以应用于同一数据数组的结束标记。一旦数据值Ome大于循环中给定间隔的右边缘,那么很明显,数据数组的其余部分也会更大。因此它们也可以被忽略。请注意,@Oriol用一个非常类似的解决方案击败了我10分钟,该解决方案也没有从一开始就重新扫描。^^不确定是否理解您在结尾部分的想法。它不适用于示例数据集,因为两个数组都以100结尾,是吗?好的,实际上它已经在那里了,我只是错过了它,在@Oriol的代码中,嵌套循环的条件与我提到的一样(;data[j]