2

我有一个数组,用于存储我目前正在处理的转换程序的转换因子。

一个简短的例子:

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

这将变得更大,并且还有更多。

看来我有两个选择。我可以声明许多数组,一个用于每种转换类型,并在函数使用中以及 if else 来指示应该调用哪一个来进行转换。另一种方法是使用一个巨大的数组来存储所有内容。这将消除对 if else 的需求,也消除了声明许多数组的需要,但代价是将所有内容组合成可能变成一团糟的东西。

我赞成第一个选项,主要是因为我喜欢模块化,它更容易调试/编辑。

我还担心速度和访问时间。使用一个大数组会产生影响,因为我正在使用键来确定调用哪些值。上面的键是“lengthsA”

谢谢。

4

3 回答 3

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)。对于单位名称,我也会更加一致(“英寸”是单数;“米”是复数)。根据您的应用程序,您可能还希望每个转换都是具有值和不确定性的结构。(有些转换因子是准确的;有些则不是。)

于 2013-07-10T16:44:55.400 回答
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),但是一旦您掌握了它,您会发现此结构更易于使用。统一才是王道!

于 2013-07-10T16:27:26.940 回答
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);
}
于 2013-07-10T16:19:28.597 回答