Q1.
객체, 키, 수를 입력받아 주어진 키에 해당하는 값이 배열인 경우, 수가 가리키는 인덱스에 해당하는 요소를 리턴해야 합니다.
function getElementOfArrayProperty(obj, key, index) {
let arrProperty = obj[key];
if (Array.isArray(obj[key])){
return arrProperty[index]
}
}
- 우선 객체에 주어진 키에 해당하는 값이 배열인지 판단한다.
- 배열이라면,
index
에 해당하는 요소를 리턴한다.
Q2.
배열과 객체를 입력받아 배열의 각 요소들을 객체의 키로 했을 때 그 값을 추출하여 만든 새로운 객체를 리턴해야 합니다.
function select(arr, obj) {
let newObj = {};
for (const arr_key in arr){
for (const obj_key in obj){
if (arr[arr_key] === obj_key){
newObj[obj_key] = obj[obj_key]
}
}
}
return newObj
}
- 배열(
arr
)의 각 요소와 객체(obj
)의 키 값이 같은지 판단한다. - 두 값을 비교하기 위해 2번의
loop
가 필요함으로for...in
으로 각 값들을 순회한다. - 비교한다.
- 값이 같다면 새로운 객체에 할당한다. 이때 인자가 변수이므로, 꼭
obj[key] = value
방식으로 할당하도록 한다.
Q3.
객체와 키를 입력받아 키에 해당하는 값이 배열인 경우, 마지막 요소를 리턴해야 합니다.
function getLastElementOfProperty(obj, property) {
let arrProperty = obj[property];
if (Array.isArray(obj[property])){
return arrProperty[arrProperty.length -1]
}
}
- 객체의 키에 해당하는 값이 배열인지 판단한다.
Array.isArray()
를 사용한다. - 해당 배열의 마지막 요소를 리턴한다.
Q4.
배열과 수를 입력받아 수가 가리키는 인덱스에 해당하는 객체의 'name' 속성 값을 리턴해야 합니다.
function getValueOfNthElement(arr, num) {
if (arr.length === 0){return 'no name'}
else{
if (num >= arr.length){
return arr[arr.length - 1].name
}
else{
return arr[num].name
}
}
}
Q5.
문자열을 입력받아 문자열을 구성하는 각 문자(letter)를 키로 갖는 객체를 리턴해야 합니다. 각 키의 값은 해당 문자가 문자열에서 등장하는 횟수를 의미하는 number 타입의 값이어야 합니다.
//실패
function countAllCharacters(str) {
let count = 0
if (str === ''){return {}}
else {
let arr = str.split('')
let newArr = Array.from(new Set(arr))
let newObj = new Object()
for (let arr_key in arr){
for (let newArr_key in newArr){
if (arr[arr_key] === newArr[newArr_key]){
count = count + 1
newObj[newArr[newArr_key]] = count
}
}
count = 0
}
return newObj
}
}
- str의 각 문자열을 배열로 받아, arr[index]로 접근하면 될 듯하여 str.split('')으로 문자열의 각 문자로 구성된 배열을 만듦.
- 예를 들어, 'banana'가 입력되었을 때 {b:1, a:3, n:2}와 같이 출력되어야 하므로 문자열의 중복을 제거한 배열을 Array.from(new Set(arr))를 활용하여 만듦.
- return 해줄 배열을 만듦.
- ['b', 'a', 'n', 'a', 'n', 'a'] 배열과 ['b', 'a', 'n'] 배열을 조건문으로 비교하며 count를 더해주는 방향으로 개수를 세려 했으나, 각 문자열 별로 서로 다른 count가 필요함을 깨닫고 문제에 봉착함.
- 이것저것 콘솔 찍어보다가 실패함.
// 성공
function countAllCharacters(str) {
let obj = {}
if(str === ''){return {}}
else{
for(let i = 0; i < str.length; i ++ ){
if (obj[str[i]] === undefined){
obj[str[i]] = 0
}
obj[str[i]] ++
}
}
return obj
}
- 문자열을 다시 배열로 받아 인덱스로 접근하고자 하는 생각이 잘못됨. 2번 일하게 되는 것임. String도 str[index]를 통해 충분히 접근 가능함.
- Object 타입의 데이터에 key: value 값을 넣기 위한 방법은 obj[key] = value 라는 점이 자꾸 잊힘. 기본적인 방법대로 하면 쉽게 Object 타입의 데이터를 만들 수 있음.
- 우선 Object의 모든 value 값은 undefined이므로, number 타입인 0으로 초기화해줌. 조건문을 활용함.
- 카운트를 위해 value ++ 를 사용하여 리턴함.
Q6.
문자열을 입력받아 가장 많이 반복되는 문자(letter)를 리턴해야 합니다.
function mostFrequentCharacter(str) {
let obj = new Object() // 객체생성
let onlyStr = str.replace(/(\s*)/g, "") // str의 띄어쓰기 제거
let mostFrequentTime = 0
let mostFrequnetWord = '' // 초기화
if (str === ''){return ''} // 빈문자열 입력에 대한 처리
else {
for (let i = 0; i < onlyStr.length; i ++){
if (obj[onlyStr[i]] === undefined){
obj[onlyStr[i]] = 0
}
obj[onlyStr[i]] ++ // 문자열 당 반복횟수를 객체 {}에 저장
console.log(obj[onlyStr[i]])
if (obj[onlyStr[i]] > mostFrequentTime){ // 가장 많이 반복되는 횟수를 표시
mostFrequentTime = obj[onlyStr[i]]
console.log(mostFrequentTime)
mostFrequnetWord = onlyStr[i]
}
}
return mostFrequnetWord
}
}
- 앞서 진행했던 코플릿에 반복 횟수를 객체 {}에 저장한다.
- 가장 많이 반복되는 문자를 찾기 위해 조건문으로 최대 횟수를 찾는다.
- 횟수에 해당하는 문자를 할당한다.
- 그 문자를 리턴한다.
function mostFrequentCharacter(str) {
let obj = { mostCount: 0, mostFrequent: '' };
for (let i = 0; i < str.length; i++) {
if (str[i] === ' ') {
continue;
}
if (obj[str[i]] === undefined) {
obj[str[i]] = 0;
}
obj[str[i]] += 1;
if (obj[str[i]] > obj['mostCount']) {
obj['mostCount'] = obj[str[i]];
obj['mostFrequent'] = str[i];
}
}
return obj['mostFrequent'];
}
변수를 활용하여 훨씬 깔끔하고 가독성 좋게 코드를 짤 수도 있다. 확실히 변수를 잘 다루는 것이 중요한 듯하다.
'Programming Language > JavaScript' 카테고리의 다른 글
[JS]arr의 다양한 메소드 (0) | 2022.05.08 |
---|---|
[JS]Function관련 문법 (0) | 2022.05.04 |
[JS]Object관련 문법 (0) | 2022.04.25 |
[JS]Array관련 문법 (0) | 2022.04.19 |
[JS]OOP: Object Oriented Programming, 소프트웨어의 목적 (0) | 2022.04.12 |