// Q1. make a string out of an array
const fruits1 = ['apple', 'banana', 'orange'];
//my answer
let fruitsString1 = fruits1.toString();
console.log(fruitsString1);
//answer
const result =fruits.join('|'); //구분자를 넣지 않아도 , 가 기본적으로 넣어짐
console.log(result);
// Q2. make an array out of a string
//my answer
const fruits2 = '🍎, 🥝, 🍌, 🍒';
let test = fruits2.split(',');
console.log(test);
//answer
const result = fruits.split(',',2); // 구분자를 입력안하면 하나의 인덱스에 들어오게됨
// 구분자 다음 입력값은 limit으로 2번째 배열값까지만 구분되어서 출력됨(optional)
console.log(result);
// Q3. make this array look like this: [5, 4, 3, 2, 1]
//my answer
const array = [1, 2, 3, 4, 5];
let q3 = array.reverse();
console.log(q3);
//answer
const result = array.reverse();
console.log(result);
console.log(array); //배열자체도 변환시키고 리턴값도 변환시킨다!
// Q4. make new array without the first two elements
// my anser
const array4 = [1, 2, 3, 4, 5];
let array4_2 = array4.splice(2,3);
console.log(array4_2);
// answer
const result = array.splice(0,2); //배열자체에서 삭제함, return값으로 삭제한 값이 나옴
console.log(result); // [1, 2]
console.log(array); // [3, 4, 5]
// 따라서 새로운 배열을 만드는 것이 아니다!
// slice를 사용해야한다 (배열해서 원하는 부분만 return해서 받아올때)
const result = array.slice(2,5); // end의 값은 배제가 된다
console.log(result); // [3, 4, 5]
console.log(array); // [1, 2, 3, 4, 5]
// Q5 ~ Q10
class Student {
constructor(name, age, enrolled, score) {
this.name = name;
this.age = age;
this.enrolled = enrolled;
this.score = score;
}
}
const students = [
new Student('A', 29, true, 45),
new Student('B', 28, false, 80),
new Student('C', 30, true, 90),
new Student('D', 40, false, 66),
new Student('E', 18, true, 88),
];
// Q5. find a student with the score 90
// my answer
for(let student of students) {
if(student.score >= 90) {
console.log(student.name);
}
}
// answer
// find() 사용: 콜백함수의 조건에 맞으면 true(멈추고),해당 배열의 값을 출력, 없으면 false(다음 값 시도), 계속 없으면 undefind
// value는 array값을 하나씩 입력해줌
const result = students.find(function(student){
// console.log(student, index); 확인해보기 (parameter에 index추가해야함)
return student.score === 90;
});
//arrow function사용
const result = students.find((student) => student.score ===90);
console.log(result)
// Q6. make an array of enrolled students
// my answer
for(let student of students) {
if(student.enrolled) {
console.log(student.name);
}
}
// answer
// filter() 사용 : 콜백함수가 true인 값만 전달
const result = students.filter((student) => student.enrolled)
console.log(result)
// Q7. make an array containing only the students' scores
// result should be: [45, 80, 90, 66, 88]
// my answer
let studentsScore = [];
students.forEach((student) => studentsScore.push(student.score));
console.log(studentsScore);
console.log(`studentsScore: ${studentsScore}`);
// ansswer
// map() 을 사용: 기존의 배열을 call back fn을 통해서 새로운 값을 도출해 해당 배열에 다시 맵핑시키는 것(retrun값으로 대체)
const result = students.map((student) => student.score);
console.log(result);
// Q8. check if there is a student with the score lower than 50
// my answer
let checkScore2 = students.forEach((student) => student.score<50 ? console.log(`${student.name} is < 50`) : console.log(`${student.name} is > 50`) );
console.log(checkScore2);
// answer
// some()사용: 배열의 요소중 callback함수가 return이 true가 되는 요소가 있는지 없는지 boolean return
const result = students.some((student) => student.score < 50);
console.log(result); //true
// every()사용: 배열의 모든 요소들이 callback함수 결과 모두 true가 되어야 true로 return
const result2 = students.some((student) => student.score < 50);
console.log(result2); //false
const result3 = !students.some((student) => student.score >= 50);
console.log(result3); //true
// Q9. compute students' average score
// my answer
let sumScore = 0;
students.forEach((student) => sumScore += student.score);
let countStudents = students.length;
console.log(sumScore/countStudents);
// answer
// reduce() 사용: (callback 함수를 전달 or initial value를 전달)
// callback함수에서 return 할때 누적된 값을 전달
// 배열의 모든 값을 누적하거나 모을때 사용하는 API
// 배열의 값 하나하나는 curr에 전달
// prev return값이 다음에 호출될때 prev로 연결된다
const result = students.reduce((prev, curr) => {
console.log('----------');
console.log(prev);
console.log(curr);
return curr.score;
}, 0) //initial value 설정시 해당 값부터 시작됨(처음 prev값으로 설정됨)
console.log(result);
// arrowFunction으로 줄이면
const result = students.reduce((prev, curr) => prev +curr.score, 0);
console.log(result / students.length);
//reduceRight은 배열의 뒤쪽부터 시작
// Q10. make a string containing all the scores
// result should be: '45, 80, 90, 66, 88'
// my answer
// API 섞어서 출력가능
let studentsString10 = studentsScore.toString();
console.log(studentsString10);
// answer
const result = students.map((student) => student.score).join();
//50점 이상
const result = students.map((student) => student.score)//[45, 80,90, 66, 88]값만 다음 filter로 넘김
.filter(score => score >= 50) //[45, 80,90, 66, 88] 중에서 50 이상인 값만 다음 조인으로 넘김
.join();
// Bonus! do Q10 sorted in ascending order
// result should be: '45, 66, 80, 88, 90'
// my answer
let orderScore = studentsScore.sort((a,b) => a-b);
console.log(orderScore);
//answer
// a: 이전값, b:현재값 이 전달되는데 -값이 전달되면 a 값이 b보다 작다고 판단됨
const result = students.map(student => student.score)
.sort((a,b)=> a - b)
.join();
console.log(result);