2013-03-04 47 views
2

在JavaScript中聲明和填充多維數組的最有效方法是什麼?在Javascript中聲明和填充多維數組的有效方法

目前,我正在做這個:

ff = Array(); 
for (i = 0; i < 30; i++) { 
    ff[i] = Array(); 
    ff[i][i] = 1.0; 
} 

ff[1][2] = 0.041666667; 
ff[1][3] = 0.000694444; 
ff[2][3] = 0.016666667; 
ff[1][4] = 0.000011574; 
ff[2][4] = 0.000277778; 
ff[3][4] = 0.016666667; 
ff[1][5] = 0.000011574; 
ff[2][5] = 0.000035315; 
ff[3][5] = 0.00211888; 
ff[4][5] = 0.1271328; 
ff[1][6] = 0.000000025; 
ff[2][6] = 0.000000589; 
ff[3][6] = 0.000035315; 
ff[4][6] = 0.00211888; 
ff[5][6] = 0.016666667; 

高達ff[n][n]其中n可高達30,這導致數百聲明數組值的行(精縮時做這件事情,甚至?)。因爲ff[n][n] = 1ff[i][j] = 1/(ff[j][i])之後我只需要填充數組的「頂部」一半,所以在聲明之後,我遍歷整個數組,並顛倒「頂部」一半以填充「底部」一半。

+4

這些值是如何生成的? – Dancrumb 2013-03-04 14:14:03

+2

不要使用'ff = Array();'使用文字說明:'ff = [];' – Chad 2013-03-04 14:14:40

+2

測試替代品http://jsperf.com/ – 2013-03-04 14:14:47

回答

2

從查看您的數字,它看起來像你試圖在不同的時間單位之間進行轉換。

我想知道更好的配合是不是一個對象。

var seconds = { 
    day: 86400, 
    hour: 3600, 
    minute: 60, 
    second: 1 
}; 

var conversions = {}; 

['day','minute','hour','second'].forEach(function(fromUnit){ 
    var subConversions = {}; 
    var fromValue = seconds[fromUnit]; 
    ['day','minute','hour','second'].forEach(function(toUnit){ 
    subConversions[toUnit] = fromValue/seconds[toUnit]; 
    }); 
    conversions[fromUnit] = subConversions; 
}); 

function convert(value, from, to){ 
    return value * conversions[from][to]; 
} 

這會給你。

轉換(1, '天', '小時')=== 24

轉換(1, '天', '第二')=== 86400

轉換(3, '小時','秒')=== 10800

即使事情比簡單的時間轉換更復雜,這種方法可能會導致更容易理解的代碼。一旦你開始給多維數組的元素賦予特殊的含義,事情會變得非常難看。

+1

非常感謝你 - 你對我的問題的原始評論讓我思考,這當然是一個更清潔的方式。 – James 2013-03-04 14:45:17

+0

最後一點:如果這些值是相對靜態的,編寫一個腳本來生成'conversions'然後將其導出到JSON,然後手動將該JSON插入到您的腳本中以靜態地定義事物是有意義的。 – Dancrumb 2013-03-04 16:06:35

0

我會做類似以下的事情:然後我會把腳本放在一個可以緩存的單獨文件中。

ff=[]; 
ff[0]=[0.041666667,000694444,016666667,000277778,016666667]; 
ff[1]=[0.041666667,000694444,016666667,000277778,016666667]; 
ff[2]=[0.041666667,000694444,016666667,000277778,016666667]; 
ff[3]=[0.041666667,000694444,016666667,000277778,016666667]; 
ff[4]=[0.041666667,000694444,016666667,000277778,016666667]; 
ff[5]=[0.041666667,000694444,016666667,000277778,016666667];