2016-03-24 15 views
-2

'da çok boyutlu bir sayı dizisinin toplamının eklenmesi, bu bir verilen gibi görünebilir, ancak sadece işlevsel programlama olduğuna inandığım şeyi kullandığım bir yanıt istiyorum ... böylece for() döngüsüne hayır. Sadece sayı ve sayı dizileri içeren çok boyutlu bir dizim olduğunu varsayalım! Böyle bir şey:JavaScript

var numberArray = [[1,5,12],[1,-1], [5,11,45,-3],[0,1,2] ... ]; 

Şimdi yerine iç içe döngüler sahip ancak ben aynı zamanda bir eylemi gerçekleştirmek istiyoruz numberArray tüm sayıların toplamını almak için .forEach ve/veya .reduce kullanmak istiyorum herhangi bir olumsuz şekilde Sayılar eklenirken eklenir veya 0 değeri verilir. Böyle bir şey işe düşündüm:

numberArray.reduce(function(a, b) { 
    a.concat(b); 
}, []); 

ama ... 0'a negatif sayıları ayarlamak (veya sadece onları ihmal) ve daha sonra toplamını almak için eylemi gerçekleştirmek için nasıl emin değilim

+1

Mark aşağı ama hiçbir neden neden? –

cevap

1

Array#reduce()'u iki kez kullanın.

var numberArray = [[1, 5, 12], [1, -1], [5, 11, 45, -3], [0, 1, 2]], 
 
    sum = numberArray.reduce(function (r, a) { 
 
     return a.reduce(function (s, b) { 
 
      return b > 0 ? s + b : s; 
 
     }, r); 
 
    }, 0); 
 

 
document.write(sum);

1

Sen iki kez azaltmak gerekebilir.

, bu

numberArray.reduce(function(prev,current){return prev.concat(current)}).reduce(function(prev,current){return prev+current}); 

DEMO

var numberArray = [[1,5,12],[1,-1], [5,11,45,-3],[0,1,2]]; 
 
    var output = numberArray.reduce(function(prev,current){return prev.concat(current)}).reduce(function(prev,current){return prev+current}); 
 
    document.body.innerHTML += output;

1

bu bağlamda bir iç içe reduce kullanmaya dene dene

var numberArray = [[1,5,12],[1,-1], [5,11,45,-3],[0,1,2]] 
var x = numberArray.reduce(function(a, b) { 
    return a + b.reduce(function(c,d){ 
     return c + ((d > 0) ? d : 0); 
    }, 0); 
}, 0); 
console.log(x); //206 
+0

İç içe geçmiş bir fare kullanmayı düşünmedim! –

+0

@MarkSandman Yeah. Bir indirgemenin içine sığarsanız, o zaman bu bir yineleme olarak kabul edilir. Yani NxN + N' çalışma zamanı olacak. Ancak yuvalanmış azaltmayı kullanırsanız, çalışma süresi "NxN" olur. Fonksiyonel programlama özelliklerini kullanırken performans hakkında düşünmeliyiz. –