将数据表存储在JavaScript变量中

将数据表存储在JavaScript变量中,javascript,Javascript,我正在制作一个特殊的“计算器”,它接受用户输入并在表格中查找数据以找到结果。但我在如何最好地做到这一点上遇到了麻烦,避免了大量的if语句 例如,假设有一些单选按钮集,每个按钮组合都有一个唯一的值,我想向用户显示该值。在JavaScript中,我将使用什么样的数据结构来解释每个按钮组合并查找相应的值 编辑:根据要求,以下是一些示例数据: | Type | Color | Output value | | small | red | 21.9 | | small | bl

我正在制作一个特殊的“计算器”,它接受用户输入并在表格中查找数据以找到结果。但我在如何最好地做到这一点上遇到了麻烦,避免了大量的if语句

例如,假设有一些单选按钮集,每个按钮组合都有一个唯一的值,我想向用户显示该值。在JavaScript中,我将使用什么样的数据结构来解释每个按钮组合并查找相应的值


编辑:根据要求,以下是一些示例数据:

| Type  | Color  | Output value |
| small | red    | 21.9         |
| small | blue   | 27.3         |
| small | yellow | 26.8         |
| large | red    | 19.2         |
...
然后向用户显示两个无线电机或下拉列表,一个用于输入,一个用于颜色。选择组合并按下按钮后,将显示输出值

在我的特殊情况下,我有一个表,有4个不同的列和许多组合。看起来一个数组就可以了,但是如果它是一个对象数组,那么我必须在每一行上键入列名(例如:
{type:'small',color:'red',output:21.9},
)--我想有没有办法用紧凑的数组语法保持对象的关联性,比如
['small',red 21.9]

对象

var states = {
    state1: value1,
    state2: value2,
    state3: value3,
    (etc)
}

我们使用的是JavaScript,所以您可以选择数组和对象。决定您应该使用哪一个的关键因素可能是基于您希望如何查找内容。数组将具有数字索引,并且必须从0开始按顺序排列,而对象使用字符串作为其索引(键),并且可以包含您希望它们包含的任何内容

如果您对类似数据库的JavaScript库感兴趣,我会看看TaffyDB。它允许您通过传入表示条件的对象来查询集合,这些条件决定了您想要返回的内容。

类似的内容

var table = [
   ["High", 1, 2, 1, 0],
   ["Medium", 0, 1, 3, 2],
   ...
]
每个数组中的第一个元素是“计算器”的结果;随后的索引表示每组单选按钮的选定索引(尽管它们也可以是单选按钮的值)

假设用户选择以下单选按钮:

var selection = [0, 1, 3, 2];
然后遍历
,切片每个“行”以排除第一个元素,并与
选择进行数组比较

for (var i = 0, row; row = table[i]; i++) {
    var sRow = row.slice(1);
    // Array compare sRow and selection (function arrayEqual not included)
    if (arrayEqual(sRow, selection)) {
        return row[0];
    }
}

// Will return "Medium"
更新:使用海报的示例数据,表格如下所示:

var table = [
   [21.9, "small", "red"],
   [27.3, "small", "blue"],
   ...
]

就内存而言,这可能不是最好的解决方案,但查找速度非常快,可以使用如下查找表:

var table = {
    'small': {
        'red': ...,
        'blue': ...
    },
    'large': {
        'red': ...,
        'blue':...
    },
    ...
}
然后,您可以通过以下方式访问值:

var value = table[type][color]
缺点是必须重复很多属性。但是如果你没有那么多不同的值,那么我认为这是可以的



如果您想节省内存,最好的方法是找出一些公式,为文本值指定数字,并动态计算值(并缓存结果)。

更好的选择可能是将表保持为字符串形式,就像您发布它一样:

table = 
    " small  red     21.9" +
    " small  blue    27.3" +
    " small  yellow  26.8" +
    " large  red     19.2"
要搜索特定值,可以使用正则表达式,例如:

function find(type, color) {
   var re = new RegExp("\\b" + type + "\\s+" + color + "\\s+(\\S+)", "m");
   var m = table.match(re)
   return m ? m[1] : null;
}

这种方法的优点是1)“数据库”保持可读性且易于维护2)regexp可能比通过嵌套数组循环更快

提供示例(输入、输出、大小、类型)将真正让人们开始研究一个好的解决方案。这取决于具体情况。如表所示,它应该是一个对象数组,但不应快于对象访问;)如果你有一个很长的字符串并且它可能会失败几次,我不确定正则表达式是否更快。。。