function getLengthOfLongestElement(arr) {
if(arr.length === 0){
return 0
}
return arr.reduce(function(acc,cur){
if(cur.length <= acc.length){
return acc
}
return cur
},0).length
}
리턴할 때 acc.length
,cur.length
로 하면 틀리고 위의코드처럼해야 정답이 되는 이유가 있었다.
내가 처음 쓴대로 작동을 한다면
첫 요소가 들어가서 acc.length 를 리턴한순간 누적값이 숫자가 되고
그 다음요소를 비교할때 다시 length를 사용하면 숫자.length 가 되어 undefined으로 비교를 진행한다.
따라서 2번째 reduce함수시작부터는
if(문자.length <= undefined) 가 되고
이경우는 무조건 false를 리턴한다.
이후 계속 else문항이 반복되고
결국 맨 마지막요소.length가 리턴될 것이다.
function studentReports(students) {
const festudent = students.filter(function(el){
return el.gender === 'female'
})
return festudent.map(function(el){
const sum = el.grades.reduce(function(acc,cur){
return acc + cur
})
const avg = sum / el.grades.length
el.grades = avg
return el
})
}
//여성으로만 이루어진 배열을 students.filer를 이용해서 리턴
//이것을 변수 festudent에 할당
//festudent 배열에서
//grades에 있는 요소들을 전부 더하는 함수를 reduce를 이용해서 만든다
//그것을 sum이라는 변수에 할당한다
//sum을 grades의 길이로 나누어서 평균값을 리턴
//.map()으로 리턴한다
function sumOfArraysInArray(arr) {
const oneArray = arr.reduce(function(acc,cur){
return acc.concat(cur)
})
return oneArray.reduce(function(acc,cur){
if(typeof(cur) === 'number'){
return acc + cur
}
return acc
},0)
}
//arr의 el들을 reduce 함수로 새로운 배열로 만든다.
//그 안에서 concat을 이용해서 arr를 1차원 배열로만든다
//그 후에 배열의 type이 "number"라면
//reduce를 이용해서 다 더해준다.
//다 더한값을 리턴한다.
function sumOfArraysInArray(arr) {
const concated = arr.reduce(function(acc,cur){
acc = acc.concat(cur)
return acc
})
const filtered = concated.filter(function(el){
return typeof el === "number"
})
if(filtered.length === 0){
return 0
}
return filtered.reduce(function(acc,cur){
return acc = acc + cur
})
}
//reduce함수로 concat을 이용해서 배열들을 하나의 배열로 만들어준다.
//변수 filtered를 선언한다. filter를 이용해서 typeof 했을 때 'number'인 것들만 걸러낸다.
//reduce를 이용해서 filtered의 숫자요소들을 다 합친값을 리턴한다.
처음 푼 방법이 더 간단한 것 같다. 근데 두번째 방법이 이해하기는 더 쉽다 ㅎ
function firstReverse(str) {
let word = str.split('').reverse()
let result = ''
for(let i = 0; i < str.length ; i = i + 1) {
result = result + word[i]
}
return result
}
//변수 word를 선언한다. str.split('')을 할당한다
//변수 word는 배열이다.
//변수 result를 선언한다. ''를 할당한다.
//for문을 만들어 word의 뒤집혀진 letter들을 하나하나 살펴본다.
//i를 선언해준다. i에 0을 할당해준다. i는 str.length보다 짧다. i는 1씩 커진다.
//word.reverse()를 사용하면 배열 word의 letter들은 반대로 정렬된다.(' ' 빈칸까지!)
//result 에 word.reverse()[i]를 더해준다. (->letter가 그대로 출력된다.)
//result를 리턴해준다!
function letterCapitalize(str) {
let word = str.split(' ')
for(let i = 0; i < word.length ; i++){
if(word[i].length > 0){
word[i] = word[i][0].toUpperCase() + word[i].substr(1)
}
}
str = word.join(' ')
return str
}
//변수 word를 선언한다. str.split(' ')를 할당한다.
//word는 배열이된다.
//만약 str이 빈 문자열이라면 ''를 리턴한다.
//for문을 만든다. i는 0이다 i는 str길이보다 작다. i++
//만약 word[i]의 길이가 0보다 크다면
//word[i][0]을 toUpperCase()를 이용해서 대문자로 바꾸어주고
//substr(1)을 사용해서 word[i][1]부터 끝까지 word[i]를 온전히 붙여준다.
//word에 join(' ')을 사용해서 떨어져있는 요소들을 붙여준다. 그러면 string이 된다.
//word.join(' ')를 리턴해준다.
join(' ')
를 쓰면 요소들이 문자열로 붙을 때 띄어쓰기가 한칸 늘어나서 붙는다
이말은 str.split(' ')
으로 한칸 줄었던 space가 join(' ')
를 사용해서 space가 한칸더 생겨서 원래의 모습대로 돌아간다는 소리이다.
function convertListToObject(arr) {
let obj = {}
for(let i = 0; i < arr.length ; i++) {
if(arr[i].length === 0){
continue
}
if(obj[arr[i][0]] === undefined ){
obj[arr[i][0]] = arr[i][1]
}
}
return obj
}
//배열을 요소로 갖는 배열을 입력받아 각 배열을 이용해 만든 객체를 리턴해야한다
//변수 obj를 선언한다. {}를 할당해준다
//
//for문을 만든다. i를 선언한다. 0 을 할당한다. i는 arr의 길이보다 짧다; i++
//만약 빈배열이 있다면 넘어간다
//처음 키를 넣고 값이 없는 키의 값은 undefined
//다음에 같은 키가 오면 그 키의 값으로 값이 변한다
//키가 이전에 들어왔다면 뒤에들어온 키값은 넣지말아야한다.
//
//arr[i][0]은 obj의 key가 되고 arr[i][1]은 obj의 value가 되어야한다
//obj를 리턴한다
//2중 for문이 돌아가는 과정
//바깥 for문에서 i 가 arr의 길이인 4보다 작은지 확인한다
// i는 0이된다 // j가 arr[i]의 길이인 2보다 작은지 확인한다 //i가 0이고 j가 0은 arr[0][0]이다. 이때 'some'이 나온다
//만약 arr[i]가 빈 배열이라면 continue로 넘어간다. arr[0][0]이 obj의 key가 된다.
//j에 1이 추가되어서 j는 1이다. //j가 arr[i]의 길이 2보다 작은지 확인한다. // arr[0][1]이되고 'like'가 된다.
//arr[0][1]은 빈 배열이 아니기 때문에 arr[0][1]은 obj의 value가 된다.
//j에 1이 추가되어 j는 2가된다 // j가 2보다 작은지 확인한다. //안쪽 for문에서 j가 2보다 작지 않아서 안쪽for문의 작동이 끝난다.
//바깥for문이 작동한다. // i가 0에서 1이 추가되어서 i는 1이된다. // arr의 길이 4보다 작은지 확인한다.
//안쪽for문이 다시 작동한다. // i가 1일때 j가 0이된다 //j가 arr[i]길이 2보다 작은지 확인한다. // 코드는 arr[1][0] 'some'이 된다.
//arr[1][0]은 obj의 key가 된다. //j에 1이 추가가 되어 j는 1이된다. // j가 arr[i]길이 4보다 작은지 확인한다. //
//arr[1][1] 'dislike'이 된다. // arr[1][1]은 빈 배열이 아니기 때문에 arr[1][1]은 obj의 value가 된다.
// j에 1이 추가되어 2가된다 // j가 2보다 작은지 확인한다. 안쪽 for문에서 j가 2보다 작지 않아서 안쪽 for문의 작동이 끝난다
function convertDoubleSpaceToSingle(str) {
let result = ''
for(let i = 0; i < str.length; i++){
if(str[i] === ' ' && str[i+1] === ' '){
i = i+1
}
result = result + str[i]
}
return result
}
//두칸의 공백이 포함된 문자열 str을 입력받는다
//변수 result를 선언한다 ''를 할당해준다
//for문을 만들어서 str을 하나하나 살펴본다
//for문에 i를 선언해주고 0을 할당한다. i 는 str의 길이보다 짧다. i는 1씩 증가한다
//만약 str[i]가 빈칸이고 str[i+1]이 빈칸이라면 i를 1 더해준다 --->수도코드를 글로 쓰자
//i에 1을 더해주어야 i번의 차례가 왔을때 i에 1이 추가되고 원래는 그 다음순서인 i+1번의 공백을 건너뛸 수 있기 때문이다
//result에 str[i]를 추가해준다