2012-07-26 44 views
1

假设我们有一个可变长度的数组,并且我想通过最大长度为100的块来处理它,并以最小数量的块进行处理。因此,对于长度为241的数组,它将是尺寸为41,100,100(或100,100,41)的3个子数组。通过子阵列处理数组

curr_len = arr.length; 
offset = curr_len%100; 
doSomethingWithSubArray(arr.slice(offset)) 

for(j = offset; j <= curr_len; j = j+100){ 
    doSomethingWithSubArray(arr.slice(j,j+100)) 
} 

我敢肯定,有这样做的更优雅的方式,可能没有for循环之前的特殊情况。有任何想法吗?

回答

2

我期望的最后一块是更小的尺寸。然后,该代码将是:

for (var i=0; i<arr.length; i+=100) 
    doSomethingWithSubArray(arr.slice(i, 100)); 

这正是我splitBy功能的作用:

Array.prototype.splitBy = function(n) { 
/* get: number of items per array 
return: array of n-sized arrays with the items (last array may contain less then n) */ 
    for (var r=[], i=0; i<this.length; i+=n) 
     r.push(this.slice(i, i+n)); 
    return r; 
} 

然后只写:

arr.splitBy(100).forEach(doSomethingWithSubArray); 
+0

当然。出于某种原因,我的大脑避免了这种情况,以避免IndexOutOfRange。我想JavaScript是美好的。 – leonsas 2012-07-26 15:54:32

+0

我的解决方案是更好的你的这个怎么样? – blueiur 2012-07-30 14:08:23

0

不是真的,使用reduce看起来是这样的:

var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; 

var splitArrays = array.reduce(function(arr, cur, i) { 
    if (i % 3 === 0) arr.push([]); 
    arr[i/3 | 0].push(cur); 
    return arr; 
}, []); 
//splitArrays looks like: 
//[[1,2,3],[4,5,6],[7,8,9],[10,11]] 

比较通用的功能

function splitArray(array, num) { 
    return array.reduce(function(arr, cur, i) { 
     if (i % num === 0) arr.push([]); 
     arr[i/num | 0].push(cur); 
     return arr; 
    }, []); 
} 
1

使用块功能〜

function chunk(a, s){ 
    for(var x, i = 0, c = -1, l = a.length, n = []; i < l; i++) 
     (x = i % s) ? n[c][x] = a[i] : n[++c] = [a[i]]; 
    return n; 
} 

console.log(chunk([1,2,3,4,5,6,7,8,9,10], 3)); 
+0

我认为我的3行代码更容易理解:-) – Bergi 2012-07-26 15:59:02

+1

@Bergi我同意。 :) – 2012-07-26 16:01:39

0

使您的doSomethingWithSubArray func如果没有更多的工作,接受一个起始索引并返回下一个未处理的索引或null。把这个“迭代器”放在while循环中。在while条件中调用此“迭代器”之后,需要在块(更新UI?)之间执行其余工作。

1

它是功能风格的递归解决方案。 无var,没有循环,没有计数,因为它更清晰

var chunk = function(arr, n){ 
    if (arr.length == 0) return []; 
    var head = arr.slice(0, n), rest = arr.slice(n); 

    return [head].concat(chunk(rest, n)); 
}; 

console.log(chunk([1,2,3,4,5,6,7,8,9,10], 3));​ 
+0

没有“var”不是真的:-)然而,大多数人理解循环比递归调用更容易 - 而且它们也更快。 – Bergi 2012-07-31 21:11:07