2014-02-20 47 views
2

我有一個陣列看起來像︰var data = [[2, 2,3], [3, 9], [5, 6,7,8]];fiddle here) 我需要能夠基於每個內部數組的索引創建一個新的數組。所以從上面的輸出我在尋找按指數平均鋸齒陣列

1 - [2,3,5] 
2 - [2,9,6] 
3 - [3,7] 
4 - [8] 

幫手平均法:

Array.prototype.average = function() { 
     var sum = this.sum(); 
     return sum/this.length; 
    }; 

我有一樣的東西:

var data = [[2, 2,3], [3, 9], [5, 6,7,8]]; 
    //Sconsole.log(data); 

    Array.prototype.averageAll = function() { 
     var avgArrays = [[]]; 
     var self = this; 

     for (var i = 0; i < self.length; i++) { 
      avgArrays[0].push(self[i][0]); 
     } 
     return avgArrays[0].average(); 
    }; 
    //3.333 to the console 
    console.log(data.averageAll()); 

我已經在本賽季硬編碼在這裏因爲如果我嘗試使用avgArrays[i][i],我收到錯誤push is not defined。舉個簡單的例子,函數計算數組中每個數組的第0個位置的平均值。如果我有這樣的不同大小的陣列,我怎樣才能使這一舉一動?

+0

我不知道我的理解。預期產出是否代表一切的平均數? –

+0

@AndreiNemes看看我在上面尋找的四個數組。函數應該返回一個數組,這是每個數組的平均值。 – wootscootinboogie

+1

用'[[2,2,3],[3,9],[5,6,7,8]]'應該返回'[2.33,6,6.5]'? – Andreas

回答

1
Array.prototype.sum = function() { 
    var total = 0; 
    for (var i = 0; i < this.length; i++) { 
     total += this[i]; 
    } 
    return total; 
}; 
Array.prototype.average = function() { 
    var sum = this.sum(); 
    return sum/this.length; 
}; 
var data = [[2, 2,3], [3, 9], [5, 6,7,8]]; 
//Sconsole.log(data); 

Array.prototype.averageAll = function() { 
    var avgArrays = []; 
    var self = this; 
    //in an array of arrays, val is an array 
    var maxLen = 0; 
    for(var i = 0; i < self.length; i++) { 
     if(self[i].length > maxLen)    
     { 
      maxLen = self[i].length; 
     } 
    } 
    console.log('maxlen is ' + maxLen); 
    for(var j = 0; j < maxLen; j++) { 
     avgArrays.push([]); 
     for(var k = 0; k < self.length; k++) { 
      if(self[k][j]){ 
        avgArrays[j].push(self[k][j]); 
       } 
     } 
    } 
    console.log(avgArrays); 
    var result = [] 
    for (var x = 0; x < avgArrays.length; x++) { 
     result.push(avgArrays[x].average()); 
    } 
    return result; 
}; 

console.log(data.averageAll()); 
+0

完美:),謝謝。 – wootscootinboogie

+0

歡迎,隨時將其標記爲答案:) – lavrik

1

我認爲下面的代碼應該構建您的陣列爲您提供:

var data = [[2, 2,3], [3, 9], [5, 6,7,8]]; 
var max = 0; 
for(var i = 0; i < data.length; i++) { 
    max = data[i].length > max ? data[i].length : max 
} 

var result = []; 
for(var i = 0; i < max; i++) { 
    result[i] = []; 
    for(var j = 0; j < data.length; j++) { 
     if(i < data[j].length) { 
      result[i].push(data[j][i]); 
     }  
    } 
} 

之後,又是微不足道的計算平均值:

var averages = []; 
for(var i = 0; i < result.length; i++) { 
    var array = result[i]; 

    var sum = 0; 
    for(var j = 0; j < array.length; j++) { 
     sum += array[j]; 
    } 

    averages.push(sum/array.length); 
} 

Fiddle here

2

減少都能得心應手這裏 -

var data= [[2, 2, 3], [3, 9], [5, 6, 7, 8]]; 

data.Average= function(itm){ 
    return data.Sum(itm)/(itm.length); 
} 

data.Sum= function(itm){ 
    return itm.reduce(function(a, b){ 
     return a+b 
    }); 
} 
data.map(data.Average); 

/* returned value: (Array) 
2.3333333333333335,6,6.5 
*/  

註釋提醒我加一個 '墊片' 爲IE8和較低的其他瀏覽器獲取地圖和reduce-

(function(){ 
    var ap= Array.prototype; //IE8 & lower 
    if(!ap.map){ 
     ap.map= function(fun, scope){ 
      var T= this, L= T.length, A= Array(L), i= 0; 
      if(typeof fun== 'function'){ 
       while(i<L){ 
        if(i in T){ 
         A[i]= fun.call(scope, T[i], i, T); 
        } 
        ++i; 
       } 
       return A; 
      } 
     }; 
    } 
    if(!ap.reduce){ 
     ap.reduce= function(fun, temp, scope){ 
      var T= this, i= 0, len= T.length, temp; 
      if(typeof fun=== 'function'){ 
       if(temp== undefined) temp= T[i++]; 
       while(i<len){ 
        if(i in T) temp= fun.call(scope, temp, T[i], i, T); 
        i++; 
       } 
      } 
      return temp; 
     } 
    } 
})(); 
+0

是否減少JavaScript的新增功能? – wootscootinboogie

+0

@wootscootinboogie是,[ECMA5](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce)標準添加 –

1

所以如果我理解正確,你想要一個由你的子數組的平均值組成的新數組? 這裏有一個簡單的方法來做到這一點,通過利用內置陣列功能

var data = [[2, 2,3], [3, 9], [5, 6,7,8]]; 

var averageAll = function(arr) { 
    return arr.map(function(a) { 
    return a.reduce(function(b,c) { return b+c; })/a.length; 
    }); 
}; 

averageAll(data); 
// -> [2.3333333333333335, 6, 6.5] 

此外,作爲一個經驗法則,不要亂用標準型的原型,以我的經驗,只導致麻煩。

0
var data = [ 
    [2, 2, 3], 
    [3, 9], 
    [5, 6, 7, 8] 
]; 

Array.prototype.averageAll = function() { 
    var result = [], 
     maxIdx = Math.max.apply(Math, this.map(function(arr) { return arr.length })); 

    for (var i = 0; i < maxIdx; i++) { 
     var sum = this.reduce(function(old, cur) { 
      return old + (cur[i] || 0); 
     }, 0); 

     result.push(sum/this.length); 
    } 

    return result; 
}; 

console.log(data.averageAll()); 
//[3.3333333333333335, 5.666666666666667, 3.3333333333333335, 2.6666666666666665] 

fiddle