2017-11-30 10 views
-1

私はlodash平坦化関数を持っていますが、すべての入れ子配列の合計を結果に加算する必要があります。このAoAのための例えば合計レベルが1つのみ返される配列の平坦化

、:

[[[1,2,3],[1,5]], [[1,1,2]]] 

結果は次のようになります。

[16,12,6,1,2,3,6,1,5,4,1,1,2] 

それを行うための効率的な方法は何ですか?

これは私がこれまでにやったことですが、それは合計1レベルだけ戻っている:あなたはアキュムレータとしての和のためのインデックスゼロでゼロを取って、配列でArray#reduceを使用することができ

function buildDataFromAOA(aoa) { 
    if (!aoa[0].length) 
     return [aoa.reduce((sum, item) => sum += item, 0)].concat(aoa); 

    let data = []; 
    for (var i = 0; i < aoa.length; i++) { 
     data = data.concat(buildDataFromAOA(aoa[i])) 
    } 

    return data; 
} 
+2

この出力を達成するためのロジックとは何ですか?また、あなたの試行を共有 – gurvinder372

+0

@ gurvinder372彼はそれぞれの配列の前に複数のメンバーを持つ各配列から合計を挿入しています。 – Bergi

答えて

2

を以下の項目。

基本的には、実際の値をインデックスゼロの合計値に加算し、実際の値をアキュムレータの最後にプッシュします。

配列が見つかった場合は、配列の長さが1かどうかがチェックされ、配列の最初の/唯一の項目が配列の場合、item変数は子配列に設定されます。

次に、同じコールバックで配列が縮小され、最初の要素が合計され、残りが配列の項目に対応する配列が返されます。

返された配列では、最初の項目は実際のアキュムレータの最初の項目に追加され、アキュムレータは配列全体にconcatinatedされて返されます。

var array = [[[1, 2, 3], [1, 5]], [[1, 1, 2]]], 
 
    result = array.reduce(function fn(r, a) { 
 
     var t; 
 
     if (Array.isArray(a)) { 
 
      while (a.length === 1 && Array.isArray(a[0])) { a = a[0]; } 
 
      t = a.reduce(fn, [0]); 
 
      r[0] += t[0]; 
 
      return r.concat(t); 
 
     } 
 
     r[0] += a; 
 
     r.push(a); 
 
     return r; 
 
    }, [0]); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

単一の関数でほぼ同じ

function fn(array) { 
 
    var result = [0]; 
 

 
    while (array.length === 1 && Array.isArray(array[0])) { 
 
     array = array[0]; 
 
    } 
 
    array.forEach(function (a) { 
 
     var t; 
 
     if (Array.isArray(a)) { 
 
      t = fn(a); 
 
      result[0] += t[0]; 
 
      Array.prototype.push.apply(result, t); 
 
      return; 
 
     } 
 
     result[0] += a; 
 
     result.push(a); 
 
    }); 
 
    return result; 
 
} 
 

 
console.log(fn([[[1, 2, 3], [1, 5]], [[1, 1, 2]]]));
.as-console-wrapper { max-height: 100% !important; top: 0; }

関連する問題