我有一个数组用于存储我正在处理的转换程序的转换因子。
一个简短的例子:
var Length =
{
"lengthsA" :
{
"inch" : 0.0254,
"yard" : 0.9144,
"mile" : 1609.344,
"foot" : 0.3048,
"metres": 1
}}
这将变得更大,而且还有更多。
看来我有两个选择。我可以声明许多数组,每个转换类型一个,在函数use和if中指示应该为转换调用哪一个。另一种方法是使用一个存储所有内容的巨大阵列。这将消除对if else的需求,并且不需要声明许多数组,但代价是将所有内容组合成可能成为一个大混乱的东西。
我赞成第一个选项,主要是因为我喜欢模块化,而且调试/编辑更容易。
我也很关心速度和访问时间。使用一个大型数组会产生影响,因为我正在使用键来确定调用哪些值。上面的关键字是“lengthsA”
感谢。
答案 0 :(得分: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
)。我对单位名称也更加一致(“英寸”是单数;“米”是复数)。根据您的应用程序,您可能还希望每次转换都是具有值和不确定性的结构。 (有些转换因子是准确的;有些则不是。)
答案 1 :(得分: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
),但是一旦获得该项,您将发现此结构更易于使用。统一是国王!
答案 2 :(得分:0)
如果为javascript定义变量,那么..
var inch=0.0254,
yard=0.9144
你可以写
<option>inch</option>
并使用
访问它window[document.select.textContent]
速度要快得多,但代码会更长。
在您的情况下,可读性更重要
所以是创建一个多维对象。(组)
访问这些值也更容易。
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);
}