2014-10-07 11 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 искусства. До тех пор вы не должны беспокоиться о преждевременной оптимизации. –

+1

Уверенный выглядит так, что 'значение' каждого будет делать хороший ключ объекта, нет? Тогда петля не требуется вообще. Это будет просто «card_values ​​[cardType]». –

+1

Задайте значение как ключ хеша, затем просто верните creditCards [key] .transactionFee. Не требуется итерации – allenhwkim

ответ

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 –

+1

@squint спасибо! – Josep

+0

'some' всегда будет медленнее, чем традиционный for-loop, поэтому сравнение не существует :), это просто лучшая альтернатива для' forEach', когда вам нужно остановить итерацию. Доступ к словарю всегда будет быстрее.Я использовал массив (где нужно поддерживать порядок сортировки) вместе со свойствами, добавленными в массив, для легкого доступа к определенному индексу. – PSL

-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

Зачем это быстрее? –

+0

@squint Две причины. 1: Прекращение итерации при обнаружении нужной карты предотвращает бессмысленную обработку. 2: Использование встроенных функций, таких как 'Array.prototype.some', всегда будет быстрее, чем эквивалент ручного' for'. –

+3

Его текущий код использует цикл 'for' и выполняет' return', когда совпадение найдено. –

Смежные вопросы