2016-07-06 39 views
0

で配列を変換するために、どのように私は、値の合計が4を超えた場合、私はしたい。このarray[2, 1, 2, 1, 1, 1, 1, 1]複雑な配列

を持って、それは、配列内の新しい配列を作るのです。 [[2,1],[2,1,1],[1,1,1]]

+3

私は論理的なルールを得るいけない... – webdeb

答えて

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

関連する問題