相当于Ruby';每一个都是JavaScript

相当于Ruby';每一个都是JavaScript,javascript,arrays,ruby,enumerator,equivalent,Javascript,Arrays,Ruby,Enumerator,Equivalent,许多语言都提出了这个问题,但javascript却没有 Ruby的方法如下所示: put(0..5)。每一个都是(2)。到 # [[0, 1], [1, 2], [2, 3], [3, 4], [4, 5]] 将(0..5)。每个(3)放置到 # [[1, 2, 3], [2, 3, 4], [3, 4, 5]] 我怎么能在javascript中为数组使用类似的方法呢?这里有一个函数可以做到这一点(ES6+): //函数方法 常量eachCons=(数组,num)=>{ 返回Array.fr

许多语言都提出了这个问题,但javascript却没有

Ruby的方法如下所示:

put(0..5)。每一个都是(2)。到
# [[0, 1], [1, 2], [2, 3], [3, 4], [4, 5]]
将(0..5)。每个(3)放置到
# [[1, 2, 3], [2, 3, 4], [3, 4, 5]]

我怎么能在javascript中为
数组
使用类似的方法呢?

这里有一个函数可以做到这一点(ES6+):

//函数方法
常量eachCons=(数组,num)=>{
返回Array.from({length:Array.length-num+1}),
(u,i)=>array.slice(i,i+num))
}
//原型覆盖方法
Array.prototype.eachCons=函数(num){
返回数组.from({length:this.length-num+1}),
(u,i)=>this.slice(i,i+num))
}
常量数组=[0,1,2,3,4,5]
const log=data=>console.log(JSON.stringify(data))
日志(每个字符(数组,2))
日志(每个字符(数组,3))
日志(array.eachCons(2))

log(array.eachCons(3))
这是一个依赖函数生成器的单行解决方案。也许略有不同,但仍然值得一试

我还添加了原型,不确定为什么要这样做,但

这个解决方案不需要ES6,它也可以与ES5一起使用,但需要注意的是,IE根本不支持函数生成器

函数*eachCons(arr,num){

对于(让counter=0;counter您可以获取长度,构建一个新数组,并使用和内置映射器映射切片数组

Number.prototype[Symbol.iterator]=函数*(){
对于(VarI=0;ithis.slice(i,i+n));
}
console.log([…10].eachCons(2));
console.log([…10].eachCons(3));

.as console wrapper{max height:100%!important;top:0;}
我非常喜欢这个!但是,我宁愿使用根据情况返回数组的解决方案。例如,生成器解决方案不允许
eachCons([1,2,3,3])。map((a)=>a[0]+a[1])
+1然而,由于该解决方案的多功能性和聪明性。我不会使用原型解决方案,但我知道有些会…@UlysseBN嗯,你可以使用:
数组。从
中,但你是对的,这是一个“缺点”发电机数量:P@UlysseBN也许在原型上不返回生成器是有意义的,但是,返回一个数组是有意义的,尽管这会带来混乱和不一致,但仍然可以解决问题(如果针对数组使用,也是有意义的).@UlysseBN作为旁注,我刚刚注意到在ruby中调用了
to_a
,因此它可能也在ruby中返回了一个迭代器,但我不太确定。@charlietfl你是对的,确实有点太多了。让我编辑一下:)。数组的另一种语法。使用内部映射器参数
Array.from({length:array.length-num+1},(u,i)=>array.slice(i,i+num))
@UlysseBN,如果您没有注意到,您可以完全排除您的
映射,并使用内部映射器本身。与您现在混合在一起的解决方案相比,性能肯定有所提高。@assoron-edited。我很高兴我发布了此问答,它每分钟都在变得更好。那[Symbol.iterator]超过
Number
绝对是一个有趣的方法,我不知道它会真正起作用。(只是一个旁注,应该是