簡體   English   中英

將數據表存儲在JavaScript變量中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM