有这个function的标准function名称?

我确定这个函数可能是普遍的(或者可能可以通过其他方式实现),但是我不确定它会被调用什么。 我正在考虑一个特定大小的滑动窗口:

let slidingMap = (arr,size, f) => { r = [] arr.reduce((acc, n) => { let b = acc.concat(n); if(b.length > size) { b.shift(); } if(b.length == size) { r.push(f(b)) } return b; },[]) return r; } 

所以给出slidingMap([1,2,3,4,5,6], 2, b => b)

你会得到[ [ 1, 2 ], [ 2, 3 ], [ 3, 4 ], [ 4, 5 ], [ 5, 6 ] ]

slidingMap([1,2,3,4,5,6], 3, b => b)

你会得到[ [ 1, 2, 3 ], [ 2, 3, 4 ], [ 3, 4, 5 ], [ 4, 5, 6 ] ]

或计算差异:

slidingMap([1,2,3,7,5,6],2, b => b.reduceRight((a, n) => a? an : n))

你会得到[1,1,4,-2,1]

或移动平均线: –

slidingMap([1,2,3,7,5,6],3, b => b.reduce((a, n) => a+n,0)/b.length)

你会得到[ 2, 4, 5, 6 ]

那么,是否有一个通用的function来实现这个function?

更新

可能更好地执行为

 let sliding = (arr,size) => { r = [] arr.reduce((acc, n) => { let b = acc.concat(n); if(b.length > size) { b.shift(); } if(b.length == size) { r.push(b) } return b; },[]) return r; } 

那么就使用地图

  sliding([1,2,3,4,5],2).map(somefunc); 

或者也许使用zip和skip (在这种情况下使用lodash)

 let sliding = (arr, size) => _.zip(..._.range(size).map(i => arr.slice(i))) .filter(a => !a.some(v => v == undefined)) 

只有这里的技巧是拉链将插入未定义,当它没有匹配,所以他们需要被过滤掉。