2013-07-10 4 views
2

У меня есть массив, который используется для хранения коэффициентов преобразования для программы конвертации, над которой я сейчас работаю.Один массив или много? (хеш-таблица)

Короткий Пример:

var Length = 
{ 
"lengthsA" : 
{ 
    "inch" : 0.0254, 
    "yard" : 0.9144, 
    "mile" : 1609.344, 
    "foot" : 0.3048, 
    "metres": 1 
}} 

Это будет гораздо больше, и есть еще много из них.

Кажется, у меня есть два варианта. Я могу либо объявить множество массивов, по одному для каждого типа конверсии и в использовании функции, а если иначе, чтобы диктовать, к кому нужно обратиться за конверсией. Альтернативой является использование одного огромного массива, который хранит все. Это аннулирует необходимость в if else, а также устраняет необходимость объявления множества массивов, но ценой объединения всего в то, что может стать одним большим беспорядком.

Я в пользу первого варианта, главным образом потому, что мне нравится модульность, и было бы легче отлаживать/редактировать.

Я также обеспокоен скоростью и временем доступа. С одним большим массивом будет наблюдаться влияние, поскольку я использую ключи, чтобы определить, какие значения вызывают. Ключ выше будет «lengthsA»

Спасибо.

+0

Какова цель создания двухуровневой структуры для 'Length'? Будет ли также запись «lengthsB» в полной структуре? Кроме того, не беспокойтесь о производительности; разница (если таковая имеется) будет незаметной. –

+0

Да, есть также длина B. спасибо за ответ на повторную работу. Я думаю, что в этом случае один более крупный объект и удаление тонны if else/case-заявлений - это путь вперед – null

ответ

0

если вы определяете переменную JavaScript так ..

var inch=0.0254, 
yard=0.9144 

Youcan записи

<option>inch</option> 

и Acces его

window[document.select.textContent] 

это намного быстрее, но код будет гораздо больше ,

В вашем случае читаемость является более важным

да так создать multidiminsional объект. (Группы)

это также легче получить доступ к значениям.

obj={ 
"length":{ 
    inches:0.0254, 
    miles:1609.344, 
}, 
"weight":{ 
    kg:1 
} 
} 

так что вы можете получить доступ к этому

obj.length.inches 

или

obj['length']['inches'] 

и написать

window.onload=function(){ 
var obj={ 
length:{ 
    inches:0.0254, 
    miles:1609.344, 
} 
} 
var select1=document.createElement('select'), 
select2=null, 
f=document.createDocumentFragment(), 
input=document.createElement('input'), 
convert=document.createElement('button'); 
for(var a in obj.length){ 
f.appendChild(document.createElement('option')).textContent=a;// easyway to access 
} 
select1.appendChild(f); 
select2=select1.cloneNode(true); 
input.type='text'; 
convert.textContent='Convert'; 

convert.addEventListener('click',function(e){ 
console.log(
    input.value, 
    obj.length[select1.textContent],// easyway to access 
    obj.length[select2.textContent]// easyway to access 
) 
},false); 

var bdy=document.body 
bdy.appendChild(input); 
bdy.appendChild(select1); 
bdy.appendChild(select2); 
bdy.appendChild(convert); 
} 
+1

_ «это намного быстрее» _ - на основании чего вы утверждаете это? По сравнению с чем? –

+0

, если он bach конвертирует много значений, напрямую присоединяется к переменной, если намного быстрее, чем цикл через объекты или массивы. У меня была аналогичная проблема, когда мне пришлось перебирать 1000 объектов и разбивать ios ... используя статические переменные, это в 1.100 раз быстрее, и это не разбило систему. – cocco

+0

Поиск свойства объекта по имени может быть намного быстрее, чем пробег серии 'if/else', чтобы определить, какую переменную использовать. –

1

Трудно сказать, не зная всех деталей вашей программы, но Я бы не использовал иерархические Объекты для хранения единиц, а плоский массив, похожий на SQL таблицы:

units = [ 
    { category: "length", name: "inch" , value: 0.0254 }, 
    { category: "length", name: "yard" , value: 0.9144 }, 
    { category: "length", name: "mile" , value: 1609.344 }, 
    { category: "length", name: "foot" , value: 0.3048 }, 
    { category: "length", name: "meter", value: 1  } 
] 

Вам потребуется несколько полезных функций, чтобы найти элементы в этой таблице (как getUnitsByCategory), но как только вы получили его , вы найдете эту структуру намного легче работать. Однородность - король!

+0

Почему вы не советуете использовать иерархические объекты? Это личное предпочтение? На данный момент я ищу скорость. Особенно при вводе всех значений, если я могу не печатать одно и то же дважды, то я немного счастливее. Он работает довольно хорошо на данный момент, беспокойство позже может привести к сбою или медленной производительности (хотя Тед ответил на это) – null

+0

в этом случае вам нужно многого, если условия ... проверка категории и имени ... a иерархический объект может иметь прямой доступ с помощью кнопок, выбрать поля и т. д. только по содержащейся в нем строке. – cocco

+0

@SteveGreen: нет, я не набирал слово «категория» пять раз при написании своего ответа, если вы это имеете в виду. – georg

2

Если бы я выполнял этот проект, я бы определенно использовал иерархическую структуру.Я мог бы начать с чем-то вроде этого:

var conversions = { 
    length : { 
     lengthsA : { 
      inch : 0.0254, 
      yard : 0.9144, 
      mile : 1609.344, 
      foot : 0.3048, 
      metres: 1 
     }, 
     lengthsB : { 
      . . . 
     } 
    }, 
    mass : { 
    }, 
    . . . 
} 

Структура: conversions.<category>.<conversion_group>.<unit_name>. Это, вероятно, так же легко поддерживать, как и любая другая структура.

Возможно, вы добавите объект reference, который указывает название устройства, которое должно быть ссылкой (например, reference : "metres" в случае lengthsA). Я также был бы более последователен в отношении имен единиц («дюйм» - единственное число, «метры» - множественное число). В зависимости от вашего приложения вы также можете захотеть, чтобы каждое преобразование было структурой со значением и неопределенностью. (Некоторые коэффициенты пересчета точны, а другие нет.)

+0

Спасибо. это то, что у меня есть. Мне нужно адресовать имена. Я как-то привык писать километры, сантиметры и т. Д. Для выпадающего списка, а не единственного, который теперь сделал это в этой таблице. Теперь очистка кода. Спасибо, что упомянул об этом. Ссылка также будет полезна. еще раз спасибо – null

Смежные вопросы