一个阵列还是多个? (哈希表)

时间:2013-07-10 16:15:11

标签: javascript arrays algorithm hashtable

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

一个简短的例子:

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

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

看来我有两个选择。我可以声明许多数组,每个转换类型一个,在函数use和if中指示应该为转换调用哪一个。另一种方法是使用一个存储所有内容的巨大阵列。这将消除对if else的需求,并且不需要声明许多数组,但代价是将所有内容组合成可能成为一个大混乱的东西。

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

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

感谢。

3 个答案:

答案 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);
}