2014-10-07 97 views
0

我有這種信用卡類型的數據結構。如何讓此功能更有效?

使得hasTransFee效率更高將是一件好事。如果我開始將卡片等添加到此列表中,它可能會變得非常大,所以它的運行速度越快越好。

任何人有任何建議嗎?

$scope.creditCards = [ 
    { name: 'VISA DEBIT/DELTA', value: 'DEL', transactionFee: false}, 
    { name: 'VISA CREDIT', value: 'VIS', transactionFee: true }, 
    { name: 'MASTERCARD CREDIT', value: 'MSC', transactionFee: true }, 
    { name: 'MASTERCARD DEBIT', value: 'MCD', transactionFee: false }, 
    { name: 'MAESTRO', value: 'MAE', transactionFee: false }, 
    { name: 'SWITCH', value: 'SWI', transactionFee: false }, 
    { name: 'VISA ELECTRON', value: 'ELC', transactionFee: false }, 
    { name: 'SOLO', value: 'SOL', transactionFee: false } 
    ]; 


var hasTransFee = function(cardType) 
{ 
for (var i=0; i < $scope.creditCards.length; i++) { 
    if($scope.creditCards[i].value==cardType && $scope.creditCards[i].transactionFee == true){ 
    return true; 
    } 
    } 
    return false; 
} 
+0

如果您有您的代碼的性能問題,做了一些分析和查明緩慢的p藝術是。在此之前,你不應該擔心過早的優化。 – 2014-10-07 23:37:38

+1

確實看起來每個人的「價值」都會成爲一個很好的對象關鍵,不是嗎?那麼根本不需要循環。它就像'card_values [cardType]'。 – 2014-10-07 23:39:26

+1

將該值設置爲哈希鍵,然後僅返回creditCards [key] .transactionFee。不需要迭代 – allenhwkim 2014-10-07 23:41:57

回答

4

看來value是一個唯一的標識符,如果這是你可以存儲「信用卡」在object代替的情況下,像這樣:

$scope.creditCards = { 
    'DEL': { name: 'VISA DEBIT/DELTA', transactionFee: false}, 
    'VIS': { name: 'VISA CREDIT', transactionFee: true }, 
    'MSC': { name: 'MASTERCARD CREDIT', transactionFee: true } 
    }; 

然後你甚至不需要的功能檢查如果信用卡有transactionFee,如果你仍然想有一個功能,該功能是這樣的:

var hasTransFee = function(cardType){ 
    return $scope.creditCards[cardType].transactionFee; 
} 
+1

這種方法是迄今爲止最快的。 http://jsperf.com/for-loop-vs-some/2 – 2014-10-08 00:04:58

+1

@squint謝謝! – Josep 2014-10-08 00:06:03

+0

'some'總是比傳統的for-loop慢,所以沒有任何比較:),當你需要停止迭代時,它只是forEach的一個更好的選擇。字典訪問總是會更快。我已經使用數組(需要維護排序順序)以及添加到數組中的屬性,以方便訪問特定的索引。 – PSL 2014-10-08 02:29:02

-1

側面說明:這是更適合CodeReview

試試這個:

var hasTransFee = function(cardType) 
{ 
    var thecard; 
    $scope.creditCards.some(function(item) { 
     return item.value == cardType && (thecard = item); 
    }); 
    return thecard && thecard.transactionFee; 
}; 

這隻會盡可能它需要重複,以便找到與卡正確的類型,並沒有進一步的(你的原始代碼將繼續掃描整個陣列,如果卡被發現,但沒有費用)。

重要事項:只有一個=登錄&& thecard = item。這是故意轉讓,需要做出最後return工作。

+5

爲什麼會更快? – 2014-10-07 23:42:52

+0

@squint兩個原因。 1:當找到所需的卡時停止迭代可防止無意義的處理。 2:使用像Array.prototype.some這樣的內置函數總是比手動for循環的高級等價。 – 2014-10-07 23:43:47

+3

他當前的代碼使用'for'循環,並在找到匹配項時執行'return'。 – 2014-10-07 23:44:25