2013-05-20 37 views
4

我有這樣的代碼:JavaScript函數接受兩個數組和字符串作爲參數

var showRegion = function(key) { 
     if (key in regionOptions) { 
      var entry  = regionOptions[key]; 
      var builder  = entry.builder; 
      var layoutObj = entry.layoutObj; 
      var viewStarter = entry.viewStarter; 

      var view = new builder(); 
      logger.info('Controller.' + key + ' => CreateAccountLayoutController'); 
      Controller.layout[layoutObj].show(view); 
      view[viewStarter](); 
     } 
    }; 

我需要的是該參數應該能夠接受一個數組或一個字符串,並應工作無論哪種方式。

樣本函數調用:

showRegion('phoneNumberRegion'); 
showRegion(['phoneNumberRegion', 'keyboardRegion', 'nextRegion']); 
+0

[?你嘗試過什麼(http://whathaveyoutried.com/)提示:'typeof運算鍵==「string'' –

+0

我認爲它能夠更好地使用' ==='而不是'==',所以我得到了 –

+1

@JuanAntonioOrozco'typeof'總是返回一個字符串,我將它與一個字符串進行比較。 '==='是多餘的,因爲類型保證已經匹配。 –

回答

7
var showRegion = function(key) { 
    if (typeof key === 'string') 
     key = [key]; 
    if (key in regionOptions) { 
     ... 

沒有必要爲每種情況下的代碼,只是轉換鍵串入一個元素的數組,數組的代碼兩者都行。

+0

除了原來的代碼只處理字符串,所以現在你將一些可以工作的東西轉換成了一些沒有的東西。但大概OP可以採取你的想法,並使其工作。 –

0

你可以使用typeof來檢查你的參數的類型並進行相應處理,如

var showRegion = function(key) { 
    if(typeof key === 'object') { 
     //its an object 
    } 
    else { 
    //not object 
    } 
} 
+0

爲什麼downvote ...?我沒有得到這個概念......?如果是,那麼請說明... –

1

這個職位是舊的,但這裏是一個很好的提示:

function showRegions(keys) { 
    keys = [].concat([], keys) 
    return keys 
} 

showRegions(1) // [1] 
showRegions([1, 2, 3]) // [1, 2, 3] 
0

你可以使用string.toString()總是返回相同的字符串的事實,而Array.toString()返回逗號分隔的字符串與string.split(',')的組合以接受三種可能的輸入:一個字符串,一個數組,一個數組逗號分隔的字符串 - 並可靠地轉換爲一個數組(前提是你不希望逗號成爲價值本身的一部分,你不介意數字變成字符串)。

在最簡單的意義上:

x.toString().split(','); 

這樣

'a' -> ['a'] 
['a','b'] -> ['a','b'] 
'a,b,c' -> ['a','b','c'] 
1 -> ['1'] 

理想情況下,你可能要忍受空,未定義,空字符串,空數組(仍然保持方便的-liner):

((x || x === 0) && (x.length || x === parseFloat(x)) ? x.toString().split(',') : []); 

這樣也

null|undefined -> [] 
0 -> ['0'] 
[] -> [] 
'' -> [] 

您可能希望以不同的方式解釋null/empty/undefined,但爲了保持一致性,此方法將這些方法轉換爲空數組,以便下游代碼不必檢查array-having-elements之外(或者如果迭代,不需要檢查。)

這可能不是非常好的表現,如果這對你是一個限制。

在您的使用情況:

var showRegion = function(key) { 
    key = ((key || key === 0) && (key.length || key === parseFloat(key)) ? key.toString().split(',') : []); 

    /* do work assuming key is an array of strings, or an empty array */ 
} 
相關問題