[TIL]21.04.20

박주홍·2021년 4월 20일
0

Today I Learned

목록 보기
3/104

객체 코플릿 오답노트

4번

객체의 키값으로 객체전체를 할당하고 싶었다. 하지만 obj1[property] = obj2[property]라고 쓰게 된다면, obj2의 객체의 전체 속성값을 가져오는 것이 아닌 부분 키의 값만 할당하는 것이기 때문에, obj1[property] = obj2; 라고 쓰는 것이 바람직 하다.

6번

틀린코드

function removeNumberValues(obj) {
  for(let key in obj){
    if(typeof(key) === 'number'){
      delete obj[key];
    }else{
      continue;
    }
  }
}

: 위의 for문 안의 if문에서 typeof(key)는 key라는 데이터타입을 계산하는 코드가 되어버리기 때문에, typeof(obj[key])로 바꿔줘야한다.

작동하는 코드

function removeNumberValues(obj) {
  for(let key in obj){
    if(typeof(obj[key]) === 'number'){
      delete obj[key];
    }else{
      continue;
    }
  }
}

For ... of 구문과 Object.entries()메소드를 사용하여 작동하는 코드
function removeNumberValues(obj) {
for(const [key, value] of Object.entries(obj)){
if(typeof(value) === 'number'){
delete obj[key];
}
}
}

: for..of 문은 보통 배열에서 많이 쓰인다..?라고 알고있다. 하지만 entries 메소드를 mdn에 검색해보면 ...

const object1 = {
  a: 'somestring',
  b: 42
};

for (const [key, value] of Object.entries(object1)) {
  console.log(`${key}: ${value}`);
}

// expected output:
// "a: somestring"
// "b: 42"
// order is not guaranteed

이렇게 쓰인다는 것을 볼 수 있다. 즉 스프레드(펴주는)로 객체를 저렇게 key와 value을 같이 출력할 수 있도록 도와주나보다. 그래서 앞의 키의 값이 숫자타입인지 아닌지를 확인하는 조건문이 있었는데, typeof(obj[key]) 대신 키의 값을 바로 키값과 같이
받아왔으므로 typeof(value)로 숫자타입인지 아닌지를 확인해주었다.

15번

틀린코드 :

function select(arr, obj) {
  let objTemp = {};
  for(let key of arr){
    for(let property in obj){
      if(key === property){
        objTemp = obj[property];
      }
    }
  }
  return objTemp;
}

여기서 객체를 리턴해야하는데 되지 않은 이유가 있다 정답은 if문 안에 objTemp = obj[property]; 이 코드 때문인데, 저렇게 할당을 해버리면 obj 키의 값만 할당이 되고, 아무리 빈 객체로 선언을 하더라고 일반 변수의 값이 들어가므로 변수로 되어 객체로 리턴할 수 가 없게된다. 그래서 작동되는 코드는 다음과 같다.

작동되는 코드

function select(arr, obj) {
  let objTemp = {};
  for(let key of arr){
    for(let property in obj){
      if(key === property){
        objTemp[property] = obj[property];
      }
    }
  }
  return objTemp;
}
        objTemp[property] = obj[property];

이 코드가 objTemp에 property가 가지고있는 값과 같은 키를 만들면서, obj[property]의 값을 objTemp[property]로 할당해준다는 말과 같다.

16번

function getLastElementOfProperty(obj, property) {
  let maybeArr = obj[property];
  if(Array.isArray(obj[property])){
    return maybeArr.slice(-1)[0];
  }
}

: return maybeArr.slice(-1)[0]; 에서 [0]을 왜 붙여줬냐면 slice(-1)라는 뜻은 맨뒤의 인덱스의 값을 가진다는 뜻이다. 해서 맨뒤의 인덱스의 값만 가지므로 배열의 요소가 하나다. 그래서 [0]로 배열의 요소를 출력한다. 만약 [0]가 없이 리턴했다면
[4] 즉 배열자체가 리턴되므로 배열의 요소를 리턴하라는 문제의 조건과 맞지않다.

똑같은 문제 작동되는 다른 코드

function getLastElementOfProperty(obj, property) {
     if(Array.isArray(obj[property])){
     let maybeArr = obj[property];
     return maybeArr[maybeArr.length - 1];
  }
}

: 이코드는 slice(-1)로 맨뒤의 인덱스의 값을 가지는 것이아닌 그저 배열의 총 길이를 구한다음 거기에 -1을 해서 맨뒤의 인덱스가 무엇인지 구한다음 그 배열의 요소를 그대로 리턴한 방식이다.

17번

틀린코드

function getValueOfNthElement(arr, num) {
  // 빈배열을 입력받은 경우 'no name'을 리턴
  if(arr.length === 0){
    return 'no name';
  }
  // 배열의 범위를 벗어나는 인덱스를 입력받은 경우, 마지막 객체의 'name' 속성값을 리턴해야 합니다.
  if(num > arr.length){
    return arr[arr.length - 1]['name'];
  }
  if(num < arr.length){
    return arr[num]['name'];
  }
}

작동되는 코드

function getValueOfNthElement(arr, num) {
  // 빈배열을 입력받은 경우 'no name'을 리턴
  if(arr.length === 0){
    return 'no name';
  }
  // 배열의 범위를 벗어나는 인덱스를 입력받은 경우, 마지막 객체의 'name' 속성값을 리턴해야 합니다.
  if(num >= arr.length){
    return arr[arr.length - 1]['name'];
  }
  if(num < arr.length){
    return arr[num]['name'];
  }
}

18번

function getAllButLastElementOfProperty(obj, key) {
  let objTemp = {};
  for(let prop in obj){
    objTemp[prop] = obj[prop];
  }
    if(Array.isArray(obj[key])){
      return objTemp[key].slice(0,objTemp[key].length - 1);
    }else{
      return [];
    }
}

: 입력받은 객체를 수정하지 말아야해서 처음 빈객체를 선언하고, 그 빈객체에 파라미터로 받은 객체를 할당하고, 만약 파라미터로 받은 객체의 키를 파라미터로 받은 key에 대입해서 값을 봤을때 배열이면, 빈객체에 파라미터로 받은 객체를 할당당한 그 객체에 마지막요소를 빼고 리턴하는 방식이다. 그외에의 것들은 빈배열을 반환했다.

19번

function extend(obj1, obj2) {
  for(let key in obj2){
    if(!(key in obj1)){
      obj1[key] = obj2[key];
    }
  }
}

: 만약 obj1에 obj2에 있는 키가 없으면 obj2에 있는 키와 키의 값을 obj1에 할당해주는 코드이다.

20번

function mostFrequentCharacter(str){
  let obj = {mostcount: 0, mostname: ''};

  for(let i = 0; i < str.length; i++){
    if(str[i] === ' '){
      continue;
    }
   
    if(obj[str[i]] === undefined){
      obj[str[i]] = 0;
    }
    obj[str[i]] = obj[str[i]] + 1;

    if(obj[str[i]] > obj['mostcount']){
      obj['mostcount'] = obj[str[i]];
      obj['mostname'] = str[i];
    }
  }
  return obj['mostname'];
}
profile
고통없는 성장은 없다고 할 수 있겠다....

0개의 댓글