Skip to content

Instantly share code, notes, and snippets.

@rodjjo
Last active March 11, 2020 14:35
Show Gist options
  • Save rodjjo/437942648c55a35a1430586342a8ab24 to your computer and use it in GitHub Desktop.
Save rodjjo/437942648c55a35a1430586342a8ab24 to your computer and use it in GitHub Desktop.
Find card's brand by given card number using it's prefix.
/*
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