我正在制作一个特殊的“计算器”,它接受用户输入并在表格中查找数据以查找结果。但是我在如何最好地做到这一点上遇到了麻烦,以避免大量的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]
?
答案 0 :(得分:5)
这样的东西?
var table = [
["High", 1, 2, 1, 0],
["Medium", 0, 1, 3, 2],
...
]
每个数组中的第一个元素是“计算器”的结果;后续的代表每组单选按钮的选定索引(尽管它们也可以是单选按钮的值)。
所以说用户选择这些单选按钮:
var selection = [0, 1, 3, 2];
然后遍历table
,切割每个“行”以排除第一个元素,并与selection
进行数组比较:
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"],
...
]
答案 1 :(得分:1)
在内存方面可能不是最好的解决方案,但查找速度非常快,会像这样查找表:
var table = {
'small': {
'red': ...,
'blue': ...
},
'large': {
'red': ...,
'blue':...
},
...
}
然后你可以只用:
访问一个值var value = table[type][color]
缺点是你必须重复很多属性。但是如果你没有那么多不同的价值观,那么我认为这是可以的。
如果你想节省内存,最好的方法是找出一些公式,为你的文本值分配数字并动态计算值(并缓存结果)。
答案 2 :(得分:0)
一个物体,我猜?
var states = {
state1: value1,
state2: value2,
state3: value3,
(etc)
}
答案 3 :(得分:0)
好吧,我们正在使用JavaScript,所以你的选择是数组和对象。确定应该使用哪个的关键因素可能取决于您想要查看的方式。数组将具有数字索引,并且必须从0开始顺序排列,而对象使用字符串作为索引(键),并且可以包含您希望它们的任何内容。
如果您对类似数据库的JavaScript库感兴趣,我会看看TaffyDB。它允许您通过传入表示确定要返回的条件的对象来查询集合。
答案 4 :(得分:0)
更好的选择可能是将表保持为字符串形式,就像您发布它一样:
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)正则表达式可能比循环嵌套数组更快。