Javascript 如何计算数组值之间的差,然后求平均值?

Javascript 如何计算数组值之间的差,然后求平均值?,javascript,arrays,functional-programming,Javascript,Arrays,Functional Programming,我正试图以一种功能性的方式来实现这一点,所以尽管我已经想到了一些方法,但我怀疑有一种更优雅的map/reduce风格的技术 给定这样的数组: [0, 47.22, 72.65, 126.93, 155.02, 307.46, 410.02, 417.21, 507.86, 510.466, 580.88, 661.29, 685.14, 695.86, 780.94, 913.2, 1352.33, 1382.99, 1435.73, 1462.03, 1495.38, 1518.03,

我正试图以一种功能性的方式来实现这一点,所以尽管我已经想到了一些方法,但我怀疑有一种更优雅的map/reduce风格的技术

给定这样的数组:

[0, 47.22, 72.65, 126.93, 155.02, 307.46, 410.02, 417.21, 
 507.86, 510.466, 580.88, 661.29, 685.14, 695.86, 780.94,
 913.2, 1352.33, 1382.99, 1435.73, 1462.03, 1495.38, 1518.03,
 1523.58, 1544.3, 1591.21, 1612.03, 1665.99, 1672.62, 11.02, 22.791]
我想计算每个项目与其以下值之间的差值,例如:

[47.22, 25.43, 54.28] // etc
(这些值是聊天消息的时间戳–我想有效地查看消息之间的间隔有多长,然后计算该用户的平均值)


我在看
reduce()
,但很难看到如何让它满足我的需要。有没有一种优雅的方法可以做到这一点,或者我的最佳选择是一个
循环,它可以向前看下一个数组项并在那里进行计算?

您可以使用
reduce()
这样做

var数据=[0,47.22,72.65,126.93,155.02,307.46,410.02,417.21,
507.86, 510.466, 580.88, 661.29, 685.14, 695.86, 780.94,
913.2, 1352.33, 1382.99, 1435.73, 1462.03, 1495.38, 1518.03,
1523.58, 1544.3, 1591.21, 1612.03, 1665.99, 1672.62, 11.02, 22.791];
var结果=数据.reduce(函数(r,e,i){
if(data[i+1])r.push(Number((data[i+1]-e).toFixed(2));
返回r;
}, [])

console.log(result)
您可以使用
reduce()
这样做

var数据=[0,47.22,72.65,126.93,155.02,307.46,410.02,417.21,
507.86, 510.466, 580.88, 661.29, 685.14, 695.86, 780.94,
913.2, 1352.33, 1382.99, 1435.73, 1462.03, 1495.38, 1518.03,
1523.58, 1544.3, 1591.21, 1612.03, 1665.99, 1672.62, 11.02, 22.791];
var结果=数据.reduce(函数(r,e,i){
if(data[i+1])r.push(Number((data[i+1]-e).toFixed(2));
返回r;
}, [])
console.log(result)
您可以使用和仅使用前置值

var数组=[0,47.22,72.65,126.93,155.02,307.46,410.02,417.21,507.86,510.466,580.88,661.29,685.14,695.86,780.94,913.2,1352.33,1382.99,1435.73,1462.03,1495.38,1518.03,1523.58,1544.3,1591.21,1612.03,1665.99,1672.62,11.02,22.791],
delta=数组.reduce(函数(r,a,i,aa){
i&r.push(a-aa[i-1]);
返回r;
}, []),
average=delta.reduce(函数(a,b){返回a+b;})/delta.length;
控制台日志(增量);
控制台日志(平均值)
.as console wrapper{max height:100%!important;top:0;}
您可以使用并仅使用前置值

var数组=[0,47.22,72.65,126.93,155.02,307.46,410.02,417.21,507.86,510.466,580.88,661.29,685.14,695.86,780.94,913.2,1352.33,1382.99,1435.73,1462.03,1495.38,1518.03,1523.58,1544.3,1591.21,1612.03,1665.99,1672.62,11.02,22.791],
delta=数组.reduce(函数(r,a,i,aa){
i&r.push(a-aa[i-1]);
返回r;
}, []),
average=delta.reduce(函数(a,b){返回a+b;})/delta.length;
控制台日志(增量);
控制台日志(平均值)

。作为控制台包装{max height:100%!important;top:0;}
您可以使用
映射
并返回当前项和下一项之间的差异

var arr=[0,47.22,72.65,126.93,155.02,307.46,410.02,417.21,
507.86, 510.466, 580.88, 661.29, 685.14, 695.86, 780.94,
913.2, 1352.33, 1382.99, 1435.73, 1462.03, 1495.38, 1518.03,
1523.58, 1544.3, 1591.21, 1612.03, 1665.99, 1672.62, 11.02, 22.791];
var输出=arr.map(函数(项、索引、arr){
返回(arr[index+1]-arr[index]);
});
输出。拼接(-1,1)//删除最后一项,它是NaN,因为它是未定义和22.791之间的差异
日志(“Diff is”,输出);
var average=output.reduce(函数(curr,prev){return curr+prev;})/output.length;

控制台日志(“平均”,平均)您可以使用
映射
并返回当前项和下一项之间的差异

var arr=[0,47.22,72.65,126.93,155.02,307.46,410.02,417.21,
507.86, 510.466, 580.88, 661.29, 685.14, 695.86, 780.94,
913.2, 1352.33, 1382.99, 1435.73, 1462.03, 1495.38, 1518.03,
1523.58, 1544.3, 1591.21, 1612.03, 1665.99, 1672.62, 11.02, 22.791];
var输出=arr.map(函数(项、索引、arr){
返回(arr[index+1]-arr[index]);
});
输出。拼接(-1,1)//删除最后一项,它是NaN,因为它是未定义和22.791之间的差异
日志(“Diff is”,输出);
var average=output.reduce(函数(curr,prev){return curr+prev;})/output.length;

控制台日志(“平均”,平均)使用
forEach
循环将相邻元素之间的差异添加到新数组中:

var-arr=[22,47.22,72.65,126.93,155.02,307.46,410.02,417.21,507.86,510.466,580.88,661.29,685.14,695.86,780.94913.21352.33,1382.99,1435.73,1462.03,1495.38,1518.031523.58,1544.3,1591.21,1612.03,1665.99,1672.62,11.02,22.791];
var result={array:[],sum:0,current:0};
arr.forEach(函数(元素、索引、数组){
this.current=((数组[索引+1]-元素)| | 0);
this.sum+=this.current;
this.array.push(this.current.toFixed(3));
},结果);
console.log(result.array);
log(“Average:,(result.sum/result.array.length).toFixed(3))

.as控制台包装{top:0;最大高度:100%!important;}
使用
forEach
循环将相邻元素之间的差异添加到新数组中:

var-arr=[22,47.22,72.65,126.93,155.02,307.46,410.02,417.21,507.86,510.466,580.88,661.29,685.14,695.86,780.94913.21352.33,1382.99,1435.73,1462.03,1495.38,1518.031523.58,1544.3,1591.21,1612.03,1665.99,1672.62,11.02,22.791];
var result={array:[],sum:0,current:0};
arr.forEach(函数(元素、索引、数组){
this.current=((数组[索引+1]-元素)| | 0);
this.sum+=this.current;
this.array.push(this.current.toFixed(3));
},结果);
console.log(result.array);
log(“Average:,(result.sum/result.array.length).toFixed(3))
。作为控制台包装{top