2012-05-05 27 views
0

我需要根據用戶選擇的下拉列表創建一定數量的對象。現在我有這個代碼。如何優化通過數字開關創建的集合?

var driversFunc = function() { 

var driversCount = osagoViewModel.fields.driversCount.selectedValue(); 

switch (driversCount) { 

    case "many": 
     return []; 
    case "1": 
     return [new driver()]; 
    case "2": 
     return [new driver(), new driver()]; 
    case "3": 
     return [new driver(), new driver(), new driver()]; 
    case "4": 
     return [new driver(), new driver(), new driver(), new driver()]; 
    case "5": 
     return [new driver(), new driver(), new driver(), new driver(), new driver()]; 
    } 
}; 

(knockout.js使用)

+1

這讓我想起了一些每日跆拳道項目...:D –

+0

無標籤擊倒因爲這個問題似乎沒有任何關係 –

回答

2

您的交換機也許能夠替換爲:

if (driversCount === "many") { 
    return []; 
} else { 
    var count = parseInt(driversCount, 10); 
    var l = []; 
    while (count--) l.push(new driver()); 
    return l; 
} 

我不明白爲什麼many映射到[]

+0

,因爲第一個規則不能考慮到大數目,因此應用不同說明 – FreeVice

+0

您可以提供哪種映射? – FreeVice

1

我不知道的背景之下,你的代碼可以使用循環被改寫:

var driversFunc = function() { 
    var driversCount = osagoViewModel.fields.driversCount.selectedValue(); 
    var result = []; 
    if (driversCount != "many") { 
     for (var i = 0; i < (+driversCount || 0); i++) { 
      result.push(new driver()); 
     } 
    } 
    return result; 
}; 
1

試試這個:

return Number(driversCount) 
     ? (function add(i){ 
      return i ? add(i-1).concat(new driver) : [] 
      }(driversCount) 
      ) 
     : []; 

或者

return Number(driversCount) 
     ? String(new Array(driversCount)) 
      .split(',') 
      .map(function(){return new driver}) 
     : []; 

String(new Array([n])).split ...語法是強制應用map方法的一個小技巧(new Array([n]).map(...)將不起作用)。

+0

對於'driversCount =「4」',它給出5個'新驅動程序'。否則它真棒:) – VisioN

+0

是的,糾正了 – KooiInc