2017-06-23 242 views
1

我有一個矩陣:薩姆在2維陣列

matrix = [[0, 1, 1, 2], 
      [0, 5, 0, 0], 
      [2, 0, 3, 3]] 

我需要計算所有數組元素不屬於下0 所以的點心,在這個例子中求和應該= 9

我有這樣的功能:

function matrixElementsSum(matrix) { 
    // Write your code here 
var Summa =0 
    for (i = 0; i<4; i++){ 
     var sum =0; 
    // console.log(matrix[i].length); //4 
    for(j=0; j<matrix.length; j++){ 
     console.log("Matrix JI "+ matrix[j][i]) 
     sum = sum +matrix[j][i]; 
     if (matrix[j][i-1]!=0){ 
      console.log(matrix[j][i-1]) 
      Summa =Summa+ sum; 
     } 
    } 
    console.log('-----------' +Summa) 
    console.log("Sum "+sum); 
    } 

    return Summa; 
} 

我想我需要改變if (matrix[j-1][i]!=0),但它不工作

+0

我相信你可以開始使用這個問題和答案:https://stackoverflow.com/questions/1230233/how-to-find-the-sum-of-an-數組數組也許然後逐步通過每一個? –

+0

@AaronBelchamber Nah。這是來自CodeFights的一個問題,而不是通用的「如何對數組進行求和」。 –

回答

2

您可以使用reduce()和裏面的forEach()循環。如果foreach循環中的當前元素爲零,則可以將該元素的索引存儲在另一個對象zero中,並且可以使用該對象檢查是否存在具有相同索引的零。

var matrix = [ 
 
    [0, 1, 1, 2], 
 
    [0, 5, 0, 0], 
 
    [2, 0, 3, 3] 
 
] 
 

 
var zero = {} 
 
var sum = matrix.reduce(function(r, e, i) { 
 
    e.forEach(function(n, j) { 
 
    if (n == 0) zero[j] = true; 
 
    if (!zero[j]) r += n; 
 
    }) 
 
    return r; 
 
}, 0) 
 

 
console.log(sum)

+0

我對這裏的機制有點困惑。我明白減少是如何增加總和值的,以及forEach如何循環遍歷每個單獨的數組並過濾出正值。但是,forEach如何識別前一個數組在同一個索引點中有零? – Jleibham

0

應該可以簡化它,並使用此:

function matrixElementsSum(matrix) { 
    var Summa =0 
    for (i = 0; i < matrix.length; i++) 
     for(j = 0; j < matrix[i].length; j++) 
     if (matrix[i-1][j] != 0) 
      Summa = Summa + matrix[i][j]; 

    return Summa; 
} 

您需要先訪問上述當前的一個數組,因此matrix[i-1],然後在同一列,因此[j](matrix[i-1])[j] ~ matrix[i-1][j]

1

你可以總結2個數組和i來自底部陣列的gnore數字,來自頂部陣列上的相同索引的哪些項目是0.

現在,您可以從末尾迭代矩陣,並對結果數組進行求和。

const matrix = [[0, 1, 1, 2], [0, 5, 0, 0], [2, 0, 3, 3]]; 
 

 
const sumNotUnderZero = (bottom, top) => 
 
    top.map((v, i) => v ? v + bottom[i] : v); 
 

 
const result = matrix.reduceRight(sumNotUnderZero) 
 
    .reduce((s, n) => s + n); 
 

 
console.log(result);

1

你可以使用Array#reduceRight建立另一個數組與價值列總和,然後用Array#reduce單個號碼。

var matrix = [[0, 1, 1, 2], [0, 5, 0, 0], [2, 0, 3, 3]], 
 
    result = matrix.reduceRight(function (a, b) { 
 
     return b.map(function (c, i) { 
 
      return c && c + a[i]; 
 
     }); 
 
    }).reduce(function (a, b) { 
 
     return a + b; 
 
    }); 
 

 
console.log(result);