Codewars 8kyu 문제 Welcome!
Codewars: Achieve mastery through challenge
Codewars is where developers achieve code mastery through challenge. Train on kata in the dojo and reach your highest potential.
www.codewars.com
언어에 해당하는 인사말이 데이터베이스로 주어짐. 함수에 언어를 매개변수로 입력하면 인사말을 찍어내야 함. 입력값이 데이터베이스에 없거나 입력값이 적절하지 않을 때를 대비해서 기본 입력값을 영어로 지정해야 함.
function greet(language) {
const database = {
english: 'Welcome',
czech: 'Vitejte',
danish: 'Velkomst',
dutch: 'Welkom',
estonian: 'Tere tulemast',
finnish: 'Tervetuloa',
flemish: 'Welgekomen',
french: 'Bienvenue',
german: 'Willkommen',
irish: 'Failte',
italian: 'Benvenuto',
latvian: 'Gaidits',
lithuanian: 'Laukiamas',
polish: 'Witamy',
spanish: 'Bienvenido',
swedish: 'Valkommen',
welsh: 'Croeso'
};
}
일단 데이터베이스를 복사해서 객체로 만듦.
그리고 어디서 본 건 있어서 입력기본값을 'english'로 설정하고 바로 채점해봄.
Default parameters
Default function parameters allow named parameters to be initialized with default values if no value or undefined is passed.
developer.mozilla.org
function greet(language) {
const database = {
english: 'Welcome',
czech: 'Vitejte',
danish: 'Velkomst',
dutch: 'Welkom',
estonian: 'Tere tulemast',
finnish: 'Tervetuloa',
flemish: 'Welgekomen',
french: 'Bienvenue',
german: 'Willkommen',
irish: 'Failte',
italian: 'Benvenuto',
latvian: 'Gaidits',
lithuanian: 'Laukiamas',
polish: 'Witamy',
spanish: 'Bienvenido',
swedish: 'Valkommen',
welsh: 'Croeso'
};
return database[language];
}
결과는 실패.
세 번째 테스트인 greet('IP_ADDRESS_INVALID')에서 undefined가 찍힘.
language = 'english'로 설정해둔 건 입력값이 없을 때만 통하고 데이터베이스에 없는 키가 들어왔을 때는 소용이 없었던 것.
그래서 객체 안에 키가 존재하는지 확인할 방법을 검색해봄.
Checking if a key exists in a JavaScript object?
How do I check if a particular key exists in a JavaScript object or array? If a key doesn't exist, and I try to access it, will it return false? Or throw an error?
stackoverflow.com
역시 스택오버플로우에서 답변 발견.
'key' in obj
이런 식으로 in 연산자를 써서 확인할 수 있다고 함. boolean을 뱉어냄.
따라서 false면 database['english']를 찍어내고 true면 database[language]를 찍어내도록 수정.
function greet(language) {
const database = {
english: 'Welcome',
czech: 'Vitejte',
danish: 'Velkomst',
dutch: 'Welkom',
estonian: 'Tere tulemast',
finnish: 'Tervetuloa',
flemish: 'Welgekomen',
french: 'Bienvenue',
german: 'Willkommen',
irish: 'Failte',
italian: 'Benvenuto',
latvian: 'Gaidits',
lithuanian: 'Laukiamas',
polish: 'Witamy',
spanish: 'Bienvenido',
swedish: 'Valkommen',
welsh: 'Croeso'
};
if (!(language in database)) return database['english'];
return database[language];
}
결과는
답변을 제출하고 다른 사람들의 코드를 살펴보다가 || 연산자를 활용하는 방법 발견.
적용해봄.
function greet(language) {
const database = {
..
};
return database[language] || database['english'];
}
효율성에 크게 영향을 미치는 것 같진 않지만 코드를 단순화할 수 있는 듯.
|| 연산자 복습.
왼쪽부터 참인 값을 찾아서 참이면 해당 값을 찍어냄. 참인 값이 끝까지 없으면 마지막 값 찍어냄.
데이터베이스 키에 없는 값이 함수에 입력되면 database[language]가 undefined로 나오므로 falsey. 따라서 database['english']를 기본값으로 설정한 효력 발생.
추가) 프로토타입 공부하다가 hasOwnProperty가 나와서 적용해봄.
function greet(language = 'english') {
const database = {
..
};
if (!database.hasOwnProperty(language)) return database['english'];
return database[language];
}