Last active
March 11, 2020 14:35
-
-
Save rodjjo/437942648c55a35a1430586342a8ab24 to your computer and use it in GitHub Desktop.
Find card's brand by given card number using it's prefix.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Creates a mapping like: | |
{ | |
'2': { # length 2 | |
'33': 'Card X' | |
}, | |
'1': { # length 1 | |
'4': 'Card Y', | |
} | |
} | |
locate by max length prefixes to min length ones. | |
*/ | |
function map_card_prefixes(cards_table) { | |
const mapping = {}; | |
Object.keys(cards_table).forEach((card_name) => { | |
cards_table[card_name].forEach((prefix) => { | |
const prefix_by_length = mapping[`${prefix}`.length] || {}; | |
prefix_by_length[`${prefix}`] = card_name; | |
mapping[`${prefix}`.length] = prefix_by_length; | |
}); | |
}); | |
return mapping; | |
} | |
function create_prefix_translator(cards_table) { | |
const prefix_mapping = map_card_prefixes(cards_table); | |
const max_length = Math.max(...Object.keys(prefix_mapping)); | |
const empty_object = {}; | |
function filter_by_length(card_number, length) { | |
const current_mapping = prefix_mapping[`${length}`] || empty_object; | |
const result = current_mapping[`${card_number}`.substring(0, length)]; | |
if (length < 2 || result) { | |
return result; | |
} | |
return filter_by_length(card_number, length - 1); | |
} | |
function find_card_brand(card_number) { | |
return filter_by_length(card_number, max_length); | |
} | |
return find_card_brand; | |
} | |
const translator = create_prefix_translator({ | |
'Visa': [23, 568, 4], | |
'Master Card': [45, 56942, 235], | |
'Nardcred': [10, 2347, 2], | |
}); | |
console.assert(translator(234444) === 'Visa', 'Expected Visa'); | |
console.assert(translator(235544) === 'Master Card', 'Expected Master Card'); | |
console.assert(translator(211111) === 'Nardcred', 'Expected Nardcred'); | |
console.assert(translator(5694211) === 'Master Card', 'Expected Master Card'); | |
console.assert(translator(5684211) === 'Visa', 'Expected Visa'); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment