[英]Store a table of data in a JavaScript variable
我正在制作一個特殊的“計算器”,它接受用戶輸入並在表中查找數據以查找結果。 但是我在如何最好地做到這一點方面遇到了麻煩,要避免大量的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 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"],
...
]
就內存而言,也許不是最好的解決方案,但查找起來卻很快,它將是一個查找表,如下所示:
var table = {
'small': {
'red': ...,
'blue': ...
},
'large': {
'red': ...,
'blue':...
},
...
}
然后,您可以使用以下方式訪問值:
var value = table[type][color]
缺點是您必須重復很多屬性。 但是,如果您沒有太多不同的值,那么我認為可以。
如果要節省內存,最好的方法是弄清楚一些公式,為文本值分配數字並即時計算值(並緩存結果)。
我猜是物體嗎?
var states = {
state1: value1,
state2: value2,
state3: value3,
(etc)
}
好吧,我們正在使用JavaScript,因此您可以選擇數組和對象。 確定應使用哪個關鍵因素可能取決於您要查找的方式。 數組將具有數字索引,並且必須從0開始是連續的,而對象使用字符串作為其索引(鍵),並且可以包含您希望它們包含的任何內容。
如果您對類似JavaScript的類似數據庫的類庫感興趣,請查看TaffyDB。 它允許您通過傳遞表示確定要返回的條件的對象來查詢集合。
更好的選擇可能是將表保留為字符串形式,就像您已將其發布一樣:
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)正則表達式可能比循環嵌套數組更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.