16

我在 Javascript 中寻找相当于 Ruby 的 Enumerable#each_slice 。

我已经在使用具有 each()、map()、inject() 的出色 underscore.js...

基本上,在 Ruby 中,这个很棒的方法可以做到这一点:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].each_slice(3) {|a| p a}

# outputs below
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
[10]
4

3 回答 3

13

这个怎么样:

Array.prototype.each_slice = function (size, callback){
  for (var i = 0, l = this.length; i < l; i += size){
    callback.call(this, this.slice(i, i + size));
  }
};

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].each_slice(3, function (slice){
  console.log(slice);
});

输出(在 Node.js 中):

[ 1, 2, 3 ]
[ 4, 5, 6 ]
[ 7, 8, 9 ]
[ 10 ]
于 2012-04-20T16:14:17.823 回答
11

我会稍微修改 Brandan 的答案,以更好地适应 JavaScript 和 underscore.js 的环境:

_.mixin({ "eachSlice": function(obj, size, iterator, context) {
    for (var i=0, l=obj.length; i < l; i+=size) {
      iterator.call(context, obj.slice(i,i+size), i, obj);
    } }});

这是一个演示

于 2012-04-20T16:31:54.403 回答
6

_.chunk在 lodash 中发现现在是一个更好的解决方案

var chunk = require('lodash/array/chunk');

_.chunk(['a', 'b', 'c', 'd'], 2);
// -> [['a', 'b'], ['c', 'd']]

https://lodash.com/docs#chunk

于 2015-05-11T06:46:31.120 回答