2012-04-20 27 views
11

Tôi đang tìm kiếm một tương đương với # Enfable của Ruby # each_slice trong Javascript.Tương đương với Ruby Enumerable # each_slice trong Javascript?

Tôi đã sử dụng underscore.js tuyệt vời mà có mỗi(), bản đồ(), bơm() ...

Về cơ bản, trong Ruby phương pháp tuyệt vời này thực hiện điều này:

[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] 
+0

Đối với bất cứ ai tìm kiếm một giải pháp jQuery có https://github.com/burin/jquery-each_slice – Espen

Trả lời

11

tôi sẽ thay đổi câu trả lời Brandan của hơi để phù hợp hơn trong môi trường của JavaScript cộng 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); 
    } }}); 

Dưới đây là một demo.

+0

Xin lỗi, làm cách nào để sử dụng? – fabian

+0

đầu tiên, mã giả sử bạn đã sử dụng 'underscore.js'; không có đối tượng '_' nào có phương thức' mixin'. Nếu bạn đã tải gạch dưới và chạy mã trên, thì bạn sẽ có phương thức '_.eachSlice' hoạt động như được yêu cầu; xem bản demo jsfiddle được liên kết trong câu trả lời của tôi. –

9

Làm thế nào về điều này:

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); 
}); 

Output (trong Node.js):

[ 1, 2, 3 ] 
[ 4, 5, 6 ] 
[ 7, 8, 9 ] 
[ 10 ] 
+0

Cảm ơn ! Tôi đang thử nghiệm điều này ngay bây giờ! –

+0

Hãy trả lời câu trả lời của Mark Reed. Tôi không quen thuộc với underscore.js. – Brandan

3

tôi đã tìm thấy _.chunk trong lodash là một giải pháp tốt hơn bây giờ

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

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

https://lodash.com/docs#chunk

+0

Điều này làm việc hoàn hảo, cảm ơn cho tip! – Brandon

Các vấn đề liên quan