function camelize(str) {
let arr = str.split('-'); //getArr = [boder, left, width];
for (let n = 1; n < arr.length; n++) {
let changeStr = arr[n].split('');
changeStr[0] = changeStr[0].toUpperCase();
arr.splice(n, 1, changeStr.join(''));
}
return arr.join('');
}
풀이 순서
split
메소드 사용for
문 작성arr[n]
의 값을 다른 변수에 저장하는데 이 때 글자로 쪼개서 전달arr
에 splice
메소드 사용하여 원래 자리의 요소는 지우고 쪼개진 글자들을 join
메서드로 모아 요소로 추가arr
를 join
메소드 사용 문자열로 변환하여 반환(split + map + join 으로 한 번에 해결)
function camelize(str) {
return str
.split('-') // splits 'my-long-word' into array ['my', 'long', 'word']
.map(
// converts ['my', 'long', 'word'] into ['my', 'Long', 'Word']
(value, index) => index == 0 ? value : value[0].toUpperCase() + value.slice(1)
)
.join(''); // joins ['my', 'Long', 'Word'] into 'myLongWord'
}
*map은 자주 사용된다고 하니 잘 알아두자.
배열 arr의 요소 중 a이상 b 이하 범위에 속하는 요소만 골라 새로운 배열에 집어넣고, 해당 요소를 출력해주는 함수 filterRange(arr, a, b)를 작성해봅시다.
새로 작성하는 함수는 기존 배열 arr을 변경하면 안 되고, 반환되는 함수는 새로운 배열이어야 합니다.
let arr = [5, 3, 8, 1];
let filtered = filterRange(arr, 1, 4);
function filterRange(arr, a, b) {
return arr.filter(value => (a <= value && value <= b))
}
alert( filtered ); // 3,1
alert( arr ); // 5,3,8,1
작성한 함수는 기존 배열을 변경하기만 하고 아무것도 반환하지 않아야 합니다.
(배열의 모든 요소(i)는 다음 조건을 만족해야 합니다. a ≤ arr[i] ≤ b)
function filterRangeInPlace(arr, a, b) {
for (let i = 0; i < arr.length; i++) {
let value = arr[i];
// 조건에 맞지 않는 요소 제거
if (value < a || value > b) {
arr.splice(i, 1);
i--;
}
}
}
let arr = [5, 2, 1, -10, 8];
arr.sort( ( a, b ) => b - a );
alert( arr ); // 8, 5, 2, 1, -10
함수 copySorted(arr)는 복사 후 정렬된 배열을 반환해야 합니다.
단 이때 arr은 변경되면 안 됩니다.
let arr = ["HTML", "JavaScript", "CSS"];
function copySorted(arr) {
// 내가 처음 작성했던 답.
let sortArr = arr.slice();
return sortArr.sort();
// 간단하게 작성이 가능하다.
return arr.slice().sort();
}
let sorted = copySorted(arr);
alert( sorted ); // CSS, HTML, JavaScript
alert( arr ); // HTML, JavaScript, CSS (no changes)
function Calculator() {
this.methods = {
"+": ( a, b ) => a + b,
"-": ( a, b ) => a - b,
};
this.calculate = function(str) {
let useSplit = str.split(' '),
a = +useSplit[0],
op = useSplit[1],
b = +useSplit[2];
if (!this.methods[op] || isNaN(a) || isNaN(b)) {
return NaN
}
return this.methods[op](a, b);
};
this.addMethod = function(name, func) {
this.methods[name] = func;
};
}
let powerCalc = new Calculator;
powerCalc.addMethod("*", (a, b) => a * b);
powerCalc.addMethod("/", (a, b) => a / b);
powerCalc.addMethod("**", (a, b) => a ** b);
let result = powerCalc.calculate("2 ** 3");
alert( result ); // 8
alert( powerCalc.calculate("3 + 7") ); // 10
name을 나타내는 프로퍼티를 가진 객체 user가 담긴 배열이 있습니다.
name의 값만 담은 새로운 배열을 만들어주는 코드를 작성해보세요.
let john = { name: "John", age: 25 };
let pete = { name: "Pete", age: 30 };
let mary = { name: "Mary", age: 28 };
let users = [ john, pete, mary ];
let names = users.map(item => item.name);
alert( names ); // John, Pete, Mary
map 메서드의 설명을 보고 간단하게 적용하였음
name과 surname을 조합해 fullName을 만들고, 이를 이용해 두 개의 프로퍼티 id와 fullName을 가진 객체를 담은 새로운 배열을 반환해주는 코드를 작성해보세요.
let john = { name: "John", surname: "Smith", id: 1 };
let pete = { name: "Pete", surname: "Hunt", id: 2 };
let mary = { name: "Mary", surname: "Key", id: 3 };
let users = [ john, pete, mary ];
let usersMapped = users.map(item => ({
fullName : `${item.name} ${item.surname}`,
id : item.id,
}));
alert( usersMapped[0].id ) // 1
alert( usersMapped[0].fullName ) // John Smith
** 여기서 ( { fullName : ~~ , id : ~~ } ) --> 중괄호를 왜 괄호로 감싸는지 궁금했는데 내 생각으론 괄호 안에 값을 묶어서 보낸다는 의미로 객체 형태로 내보내기 위한 것으로 생각된다. ( 틀렸다. )
** 해설을 보았는데 화살표 함수는 본문이 없는 형태와 본문이 있는 형태인 방법으로 작성한다고 한다.
본문 없는 형태 value => expr(표현식)
, 본문이 있는 형태 value => {...}
이 때 중괄호를 만나게 되면 JS는 객체의 시작이 아닌 함수가 실행되는 본문인 것으로 인식해버린다고 함. 그래서 소괄호를 사용하여 이를 피하는 것이라고 함!
users.map(item => { fullName :(?) =(?) item.name + item.surname, id :(?) =(?) item.id }
let john = { name: "John", age: 25 };
let pete = { name: "Pete", age: 30 };
let mary = { name: "Mary", age: 28 };
let arr = [ pete, john, mary ];
function sortByAge(arr) {
arr.sort((a, b) => a.age - b.age);
}
// now: [john, mary, pete]
sortByAge(arr);
** 나의 초기 답안..
arr.sort
로 이미 arr안에 접근하였으니 다시 arr를 쓰지않고 바로 index.key value값을 찾아주면 된다.. (a, b) 2개 이상의 매개변수는 감싸줘라 제발..
function sortByAge(arr) {
arr.sort(a, b => arr[a].age - arr[b].age);
}
age를 나타내는 프로퍼티를 가진 객체가 여러 개 담긴 배열이 있습니다.
평균 나이를 반환해주는 함수 getAverageAge(users)를 작성해보세요.
평균을 구하는 공식은 (age1 + age2 + ... + ageN) / N 입니다.
let john = { name: "John", age: 25 };
let pete = { name: "Pete", age: 30 };
let mary = { name: "Mary", age: 29 };
let arr = [ john, pete, mary ];
function getAverageAge(people) {
return (people.reduce((prev, user) => prev + user.age, 0)) / people.length;
}
alert( getAverageAge(arr) ); // (25 + 30 + 29) / 3 = 28
풀이
function unique(arr) {
let newArr = [];
for (let key of arr) {
if(!newArr.includes(key)) {
newArr.push(key);
}
}
return newArr
};
let strings = ["Hare", "Krishna", "Hare", "Krishna",
"Krishna", "Krishna", "Hare", "Hare", ":-O"
];
alert( unique(strings) ); // Hare, Krishna, :-O
for ... of
로 주어진 배열을 모두 돌 수 있도록 작성