2013-03-04 2 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] = 1 и ff[i][j] = 1/(ff[j][i]), поэтому после объявления я перебираю весь массив и инвертирую «верхнюю» половину, чтобы заполнить «нижнюю» половину.

+4

Как генерируются значения? – Dancrumb

+2

Не используйте 'ff = Array();' use literal declaration: 'ff = [];' – Chad

+2

Проверьте альтернативы, которые возникают с помощью http://jsperf.com/ –

ответ

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, 'hour', 'second') === 10800

Даже если дело сложнее простого преобразования времени, этот подход, вероятно, приведет к значительно более понятному коду. Как только вы начнете придавать элементам многомерного массива специальные значения, все может стать довольно уродливым.

+1

Большое спасибо за это - ваши первоначальные комментарии по моему вопросу заставили меня задуматься, и это, безусловно, более чистый способ. – James

+0

Последняя точка: если эти значения относительно статичны, может возникнуть смысл написать сценарий для создания «конверсий», а затем экспортировать его в JSON, а затем вручную вставить этот JSON в ваш скрипт для статического определения вещей. – Dancrumb

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]; 
Смежные вопросы