-
-
Save calebgrove/c285a9510948b633aa47 to your computer and use it in GitHub Desktop.
// There's some better solutions in the comments, so scroll down and see how other folks have improved this! | |
// USAGE: | |
// abbrState('ny', 'name'); | |
// --> 'New York' | |
// abbrState('New York', 'abbr'); | |
// --> 'NY' | |
function abbrState(input, to){ | |
var states = [ | |
['Arizona', 'AZ'], | |
['Alabama', 'AL'], | |
['Alaska', 'AK'], | |
['Arkansas', 'AR'], | |
['California', 'CA'], | |
['Colorado', 'CO'], | |
['Connecticut', 'CT'], | |
['Delaware', 'DE'], | |
['Florida', 'FL'], | |
['Georgia', 'GA'], | |
['Hawaii', 'HI'], | |
['Idaho', 'ID'], | |
['Illinois', 'IL'], | |
['Indiana', 'IN'], | |
['Iowa', 'IA'], | |
['Kansas', 'KS'], | |
['Kentucky', 'KY'], | |
['Louisiana', 'LA'], | |
['Maine', 'ME'], | |
['Maryland', 'MD'], | |
['Massachusetts', 'MA'], | |
['Michigan', 'MI'], | |
['Minnesota', 'MN'], | |
['Mississippi', 'MS'], | |
['Missouri', 'MO'], | |
['Montana', 'MT'], | |
['Nebraska', 'NE'], | |
['Nevada', 'NV'], | |
['New Hampshire', 'NH'], | |
['New Jersey', 'NJ'], | |
['New Mexico', 'NM'], | |
['New York', 'NY'], | |
['North Carolina', 'NC'], | |
['North Dakota', 'ND'], | |
['Ohio', 'OH'], | |
['Oklahoma', 'OK'], | |
['Oregon', 'OR'], | |
['Pennsylvania', 'PA'], | |
['Rhode Island', 'RI'], | |
['South Carolina', 'SC'], | |
['South Dakota', 'SD'], | |
['Tennessee', 'TN'], | |
['Texas', 'TX'], | |
['Utah', 'UT'], | |
['Vermont', 'VT'], | |
['Virginia', 'VA'], | |
['Washington', 'WA'], | |
['West Virginia', 'WV'], | |
['Wisconsin', 'WI'], | |
['Wyoming', 'WY'], | |
]; | |
if (to == 'abbr'){ | |
input = input.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); | |
for(i = 0; i < states.length; i++){ | |
if(states[i][0] == input){ | |
return(states[i][1]); | |
} | |
} | |
} else if (to == 'name'){ | |
input = input.toUpperCase(); | |
for(i = 0; i < states.length; i++){ | |
if(states[i][1] == input){ | |
return(states[i][0]); | |
} | |
} | |
} | |
} |
Here's @davidteather's solution in TypeScript:
export default function stateAbbrToName(acronym: string) {
const states = {
AZ: 'Arizona',
AL: 'Alabama',
AK: 'Alaska',
AR: 'Arkansas',
CA: 'California',
CO: 'Colorado',
CT: 'Connecticut',
DC: 'District of Columbia',
DE: 'Delaware',
FL: 'Florida',
GA: 'Georgia',
HI: 'Hawaii',
ID: 'Idaho',
IL: 'Illinois',
IN: 'Indiana',
IA: 'Iowa',
KS: 'Kansas',
KY: 'Kentucky',
LA: 'Louisiana',
ME: 'Maine',
MD: 'Maryland',
MA: 'Massachusetts',
MI: 'Michigan',
MN: 'Minnesota',
MS: 'Mississippi',
MO: 'Missouri',
MT: 'Montana',
NE: 'Nebraska',
NV: 'Nevada',
NH: 'New Hampshire',
NJ: 'New Jersey',
NM: 'New Mexico',
NY: 'New York',
NC: 'North Carolina',
ND: 'North Dakota',
OH: 'Ohio',
OK: 'Oklahoma',
OR: 'Oregon',
PA: 'Pennsylvania',
RI: 'Rhode Island',
SC: 'South Carolina',
SD: 'South Dakota',
TN: 'Tennessee',
TX: 'Texas',
UT: 'Utah',
VT: 'Vermont',
VA: 'Virginia',
WA: 'Washington',
WV: 'West Virginia',
WI: 'Wisconsin',
WY: 'Wyoming',
AS: 'American Samoa',
GU: 'Guam',
MP: 'Northern Mariana Islands',
PR: 'Puerto Rico',
VI: 'U.S. Virgin Islands',
UM: 'U.S. Minor Outlying Islands',
}
return states[acronym] ?? acronym
}
Most of these solutions add unnecessary complexity without significant improvement in speed, readability, reliability, or usefulness. @davidteather is on the right track. Here's the "inverse" of his solution, for converting from a state name into an abbreviation. It's simple, fast, and readable.
function stateNameToAbbreviation(name) {
let states = {
"arizona": "AZ",
"alabama": "AL",
"alaska": "AK",
"arkansas": "AR",
"california": "CA",
"colorado": "CO",
"connecticut": "CT",
"district of columbia": "DC",
"delaware": "DE",
"florida": "FL",
"georgia": "GA",
"hawaii": "HI",
"idaho": "ID",
"illinois": "IL",
"indiana": "IN",
"iowa": "IA",
"kansas": "KS",
"kentucky": "KY",
"louisiana": "LA",
"maine": "ME",
"maryland": "MD",
"massachusetts": "MA",
"michigan": "MI",
"minnesota": "MN",
"mississippi": "MS",
"missouri": "MO",
"montana": "MT",
"nebraska": "NE",
"nevada": "NV",
"new hampshire": "NH",
"new jersey": "NJ",
"new mexico": "NM",
"new york": "NY",
"north carolina": "NC",
"north dakota": "ND",
"ohio": "OH",
"oklahoma": "OK",
"oregon": "OR",
"pennsylvania": "PA",
"rhode island": "RI",
"south carolina": "SC",
"south dakota": "SD",
"tennessee": "TN",
"texas": "TX",
"utah": "UT",
"vermont": "VT",
"virginia": "VA",
"washington": "WA",
"west virginia": "WV",
"wisconsin": "WI",
"wyoming": "WY",
"american samoa": "AS",
"guam": "GU",
"northern mariana islands": "MP",
"puerto rico": "PR",
"us virgin islands": "VI",
"us minor outlying islands": "UM"
}
let a = name.trim().replace(/[^\w ]/g, "").toLowerCase(); //Trim, remove all non-word characters with the exception of spaces, and convert to lowercase
if(states[a] !== null) {
return states[a];
}
return null;
}
another ts version:
/**
- Convert US state abbreviation to full name and vice-versa
- @param {string} input - input string to convert
*/
export default function convertUsStateAbbrAndName(input: string): string | null {
const toAbbr = input.length !== 2;
const states = [
['Alabama', 'AL'],
['Alaska', 'AK'],
['American Samoa', 'AS'],
['Arizona', 'AZ'],
['Arkansas', 'AR'],
['Armed Forces Americas', 'AA'],
['Armed Forces Europe', 'AE'],
['Armed Forces Pacific', 'AP'],
['California', 'CA'],
['Colorado', 'CO'],
['Connecticut', 'CT'],
['Delaware', 'DE'],
['District Of Columbia', 'DC'],
['Florida', 'FL'],
['Georgia', 'GA'],
['Guam', 'GU'],
['Hawaii', 'HI'],
['Idaho', 'ID'],
['Illinois', 'IL'],
['Indiana', 'IN'],
['Iowa', 'IA'],
['Kansas', 'KS'],
['Kentucky', 'KY'],
['Louisiana', 'LA'],
['Maine', 'ME'],
['Marshall Islands', 'MH'],
['Maryland', 'MD'],
['Massachusetts', 'MA'],
['Michigan', 'MI'],
['Minnesota', 'MN'],
['Mississippi', 'MS'],
['Missouri', 'MO'],
['Montana', 'MT'],
['Nebraska', 'NE'],
['Nevada', 'NV'],
['New Hampshire', 'NH'],
['New Jersey', 'NJ'],
['New Mexico', 'NM'],
['New York', 'NY'],
['North Carolina', 'NC'],
['North Dakota', 'ND'],
['Northern Mariana Islands', 'NP'],
['Ohio', 'OH'],
['Oklahoma', 'OK'],
['Oregon', 'OR'],
['Pennsylvania', 'PA'],
['Puerto Rico', 'PR'],
['Rhode Island', 'RI'],
['South Carolina', 'SC'],
['South Dakota', 'SD'],
['Tennessee', 'TN'],
['Texas', 'TX'],
['US Virgin Islands', 'VI'],
['Utah', 'UT'],
['Vermont', 'VT'],
['Virginia', 'VA'],
['Washington', 'WA'],
['West Virginia', 'WV'],
['Wisconsin', 'WI'],
['Wyoming', 'WY'],
];
// So happy that Canada and the US have distinct abbreviations
const provinces = [
['Alberta', 'AB'],
['British Columbia', 'BC'],
['Manitoba', 'MB'],
['New Brunswick', 'NB'],
['Newfoundland', 'NF'],
['Northwest Territory', 'NT'],
['Nova Scotia', 'NS'],
['Nunavut', 'NU'],
['Ontario', 'ON'],
['Prince Edward Island', 'PE'],
['Quebec', 'QC'],
['Saskatchewan', 'SK'],
['Yukon', 'YT'],
];
const regions = states.concat(provinces);
let i; // Reusable loop variable
if (toAbbr) {
input = input.replace(/\w\S*/g, function (txt: string) {
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
});
for (i = 0; i < regions.length; i++) {
if (regions[i][0] === input) {
return regions[i][1];
}
}
} else {
input = input.toUpperCase();
for (i = 0; i < regions.length; i++) {
if (regions[i][1] === input) {
return regions[i][0];
}
}
}
return null;
}
Thanks @davidteather, @nandorojo, @rinogo! Very helpful.
stateNameToAbbreviation.ts
export default function stateNameToAbbreviation(name: string): string {
const lowerCaseAbbreviationKey = name.trim().replace(/[^\w ]/g, "").toLowerCase(); // Trim, lowercase and remove all non-word characters with the exception of spaces
return states[lowerCaseAbbreviationKey] ?? name; // Return name if record is not found
}
const states: Record<string, string> = {
"arizona": "AZ",
"alabama": "AL",
"alaska": "AK",
"arkansas": "AR",
"california": "CA",
"colorado": "CO",
"connecticut": "CT",
"district of columbia": "DC",
"delaware": "DE",
"florida": "FL",
"georgia": "GA",
"hawaii": "HI",
"idaho": "ID",
"illinois": "IL",
"indiana": "IN",
"iowa": "IA",
"kansas": "KS",
"kentucky": "KY",
"louisiana": "LA",
"maine": "ME",
"maryland": "MD",
"massachusetts": "MA",
"michigan": "MI",
"minnesota": "MN",
"mississippi": "MS",
"missouri": "MO",
"montana": "MT",
"nebraska": "NE",
"nevada": "NV",
"new hampshire": "NH",
"new jersey": "NJ",
"new mexico": "NM",
"new york": "NY",
"north carolina": "NC",
"north dakota": "ND",
"ohio": "OH",
"oklahoma": "OK",
"oregon": "OR",
"pennsylvania": "PA",
"rhode island": "RI",
"south carolina": "SC",
"south dakota": "SD",
"tennessee": "TN",
"texas": "TX",
"utah": "UT",
"vermont": "VT",
"virginia": "VA",
"washington": "WA",
"west virginia": "WV",
"wisconsin": "WI",
"wyoming": "WY",
"american samoa": "AS",
"guam": "GU",
"northern mariana islands": "MP",
"puerto rico": "PR",
"us virgin islands": "VI",
"us minor outlying islands": "UM",
};
Thanks for the previous json object. I've added Samoa, Guam, Northern Mariana Islands, Puerto Rico, U.S. Virgin Islands and U.S. Minor Outlying islands.