2012-07-09 62 views
0

我有一個函數,它對一個數組進行排序,並且我有自定義排序函數。事情是這樣的:javascript獲取函數內嵌套函數的索引

function SortTheArray() { 

    function SortCriteria1Asc(a, b) { ... } 
    function SortCriteria1Dsc(a, b) { ... } 
    function SortCriteria2Asc(a, b) { ... } 
    function SortCriteria1Asc(a, b) { ... } 

    var CustomSort; 

    switch (SomeVar) { 

    case 1: 
     CustomSort = SortCriteria1Asc; 
     break; 

    case 2: 
     CustomSort = SortCriteria1Dsc; 
     break; 

    case .... 
    } 

    SomeDataArray.sort(CustomSort); 
} 

是否可以刪除switch聲明並說,CustomSort功能就等於第n個嵌套函數?

感謝您的建議。

+0

你真的想讓這段代碼更難讀嗎? – GolezTrol 2012-07-09 15:16:00

+0

我覺得它很可讀;什麼不清楚? – frenchie 2012-07-09 15:16:38

+0

現在是,但是如果你使用這些答案會是什麼? – GolezTrol 2012-07-09 15:19:49

回答

4

不要給函數名稱,將它們存儲在數組中。

var functions = [ 
    function (a,b) { ... }, 
    function (a,b) { ... }, 
    function (a,b) { ... } 
]; 

然後,只需:

SomeDataArray.sort(functions[SomeVar]); 

...但數字索引功能標識符不聽起來像是一個非常好的主意。你最好使用一個對象而不是數組,並給它們描述性的名字。

+0

啊是的,很聰明;謝謝。 – frenchie 2012-07-09 15:15:40

+0

太糟糕了,你甚至可以通過這種方式來釋放更多的上下文。現在你得到了SomeVar,它有一個Integer值,指的是一個匿名函數X,它顯然以某種方式排序......當然,你可以評論你的代碼,但是你仍然得到了第一個相同數量的行,只有較少可讀性。 – GolezTrol 2012-07-09 15:17:31

+0

我可以將函數保存在數組名稱中嗎? – frenchie 2012-07-09 15:19:57

1

你可以簡單地在一個陣列直接建立自己的功能:

function SortTheArray() { 
    var functions = []; 
    functions.push(function(a,b) { ... }); 

則可以執行functions[i](a,b)

+0

好的,好主意,謝謝你的回答! – frenchie 2012-07-09 15:16:02

3

爲什麼不定義由您正在切換的變量索引的對象中的內部函數?

function SortTheArray(someVar){ 

    var sorters = { 
     CriteriaA: function(array){ ... }; 
    }; 
    return sorters[someVar]; 
}; 
+1

+1提供的代碼至少顯示一點清晰度。 – GolezTrol 2012-07-09 15:18:41