2010-12-17 76 views
0

我正在製作一個特殊的「計算器」,它接受用戶輸入並查找表中的數據以查找結果。但是,我很難做到這一點,以避免大量的if語句。將數據表存儲在JavaScript變量中

作爲一個例子,假設有一些單選按鈕組,每個按鈕組合都有一個我想向用戶顯示的唯一值。我將在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

提供示例(輸入,輸出,大小,類型)將真正讓人們開始研究一個好的解決方案。 – dheerosaur 2010-12-17 15:32:17

+0

這取決於。作爲_table_它應該__適當_是一個對象數組_IMO_。 – 2010-12-17 15:34:01

回答

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"], 
    ... 
] 
0

一個對象,我猜?

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

那麼,我們正在使用JavaScript,所以您的選擇是數組和對象。決定你應該使用什麼的關鍵因素可能取決於你想要查看的東西。數組將具有數字索引,並且必須從0開始連續,而對象使用字符串作爲它們的索引(鍵),並且可以包含任何你想要的東西。

如果你對類似數據庫的JavaScript類庫感興趣,我會看看TaffyDB。它允許您通過傳入表示確定要返回的條件的對象來查詢集合。

1

也許不會在內存方面的最佳解決方案,但速度非常快擡頭,將是一個查找表,如下所示:

var table = { 
    'small': { 
     'red': ..., 
     'blue': ... 
    }, 
    'large': { 
     'red': ..., 
     'blue':... 
    }, 
    ... 
} 

然後,你可以只訪問一個值:

var value = table[type][color] 

缺點是你必須重複很多屬性。但是如果你沒有那麼多不同的價值觀,那麼我認爲這是可以的。


如果你想節省內存,最好的辦法是找出一些公式,分配號碼的文本值並計算在飛行中的值(和緩存結果)。

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)正則表達式可能比循環嵌套數組的速度更快。

+0

但不會比對象訪問速度更快;)如果您有一個長字符串並且它可能會失敗幾次,我不確定該正則表達式是否會更快...... – 2010-12-17 16:42:20