2014-10-07 72 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