2016-07-06 55 views

回答

2

你可以使用Array#reduce,並用它添加最後插入陣列的數值和整個結果陣列。

的算法的主要部分是此行

!i || r[r.length - 1].reduce(add, 0) + a > 4 ? 
    r.push([a]) : 
    r[r.length - 1].push(a); 

在這裏面,一進行檢查,如果i是零(在開始時),或者如果結果的最後陣列的總和在總和當實際項目大於4時,則添加具有實際值的新數組。如果不是,則該元素被推送到最後一個數組。

var data = [2, 1, 2, 1, 1, 1, 1, 1], 
 
    add = function (a, b) { return a + b; }, 
 
    result = data.reduce(function (r, a, i) { 
 
     !i || r[r.length - 1].reduce(add, 0) + a > 4 ? r.push([a]) : r[r.length - 1].push(a); 
 
     return r; 
 
    }, []); 
 

 
console.log(result);

+1

哇,我看到您的解決方案,非常優雅+1 –

0

你可以通過數組循環,並建立一個新的,如果總和超過4推前一陣到像結果:

var myArr = [2, 1, 2, 1, 1, 1, 1, 1]; 

var newArr = []; 
var newInner = []; 

for (var i = 0; i < myArr.length; i++) { 
    if (summArr(newInner) + myArr[i] > 4) { 
    newArr.push(newInner); 
    newInner = []; 
    } 
    newInner.push(myArr[i]); 
    if (i==myArr.length-1) newArr.push(newInner); 
} 

function summArr(arr) { 
    return arr.reduce(add, 0); 

    function add(a, b) { 
    return a + b; 
    } 
} 

演示:https://jsfiddle.net/q0ps7960/

0

簡單的方法...

var array1 = [2, 1, 2, 1, 1, 1, 1, 1]; 
 
\t var tmp=[]; 
 
\t var output=[]; 
 
\t var sum=0; 
 
\t \t for(var i=0; i<array1.length; i++){ 
 
\t \t \t sum +=array1[i]; 
 
\t \t \t if(sum<=4){ 
 
\t \t \t \t tmp.push(array1[i]); 
 
\t \t \t }else{ 
 
\t \t \t \t output.push(tmp); 
 
\t \t \t \t sum =array1[i]; 
 
\t \t \t \t tmp=[array1[i]]; 
 
\t \t \t } 
 
\t \t } 
 
\t \t output.push(tmp); 
 
console.log(output);