코딩기록

[82] getValues / 배열안 객체 키로 값만 배열로 찾기 본문

프론트/JS)코딩테스트

[82] getValues / 배열안 객체 키로 값만 배열로 찾기

뽀짝코딩 2024. 8. 8. 21:00
728x90

문제

 

  • todos 배열과 todos 배열의 요소인 todo 객체의 프로퍼티 키(id, content, completed) 중 하나를 문자열로 전달하면 해당 프로퍼티 키로 todos 배열의 요소를 정렬해 todos 배열을 반환한다.
    • for 문, for…in 문, for…of 문, Array#forEach는 사용하지 않는다.
    • todos 배열을 변경하지 않는다.
const getValues = (todos, key) => { /* Do something */ }

const todos = [
  { id: 3, content: 'HTML', completed: false },
  { id: 2, content: 'CSS', completed: true },
  { id: 1, content: 'Javascript', completed: false },
];

console.log(getValues(todos, 'id')); // [3, 2, 1]
console.log(getValues(todos, 'content')); // ['HTML', 'CSS', 'Javascript']
console.log(getValues(todos, 'completed')); // [false, true, false]

 

 

 


풀이

1번 풀이

처음에는 todos 배열의 객체 하나씩 돌아 typeof로 테이터 타입을 확인하고 숫자형, 문자형, 불린형이 인수로 들어온 'key'와 동일하면 출력하는 전략으로 갔다. 

=> if 문은 통과하는데 값이 배열에 안들어 간다. 왜인지 모르겠다.

  return todos.map((todo) => {
    if (typeof (todo.id) === 'number') {
      todo.id;
    } else if (typeof (todo.content) === 'string') {
      todo.content;
    } else (typeof (todo.completed) === 'boolean')
    todo.completed;
  });
 
  // print
  [undefined, undefined, undefined]
  [undefined, undefined, undefined]
  [undefined, undefined, undefined]

 

 

2번 풀이

 '  && key === 'id'  '  추가

기존 if 문에  키로 들어오는 인자가 'id', 'content', 'completed' 가 맞는지 확인 하는 코드를 추가했다.

=> 동일하게 값이 undefined로 나온다.

 

 

3번 풀이

 '  삼항연산자 ' 

처음 부터 삼항연산자를 시도 하고 포문도 시도했지만 자꾸 안되서 모든 값을 다 콘솔로그로 확인해봤다.

그리고 머리싸매던중 갑자기 key를 안썼다는 생각이 들었다❗❗

 

const valuesArray = todos.map((todo) => {
  typeof (todo.id) === 'number' ? todo.id :
    (typeof (todo.content) === 'string') ? todo.content :
      (typeof (todo.completed) === 'boolean') ? todo.completed : todo;
  
  
  	// 들어오는 값 확인
    console.log("todo.id: ", todo.id );  // 3, 2, 1,  *3 
    console.log("todo: ", todo);  //  { id: 3, ..., ... } 객체 한줄씩 출력  *3
    console.log("key>>> ", key ); // id*3, content*3, completed*3
    console.log(" typeof(todo.content) ", typeof (todo.content));  // string
    console.log(" typeof(todo.completed) ", typeof (todo.completed));  // boolean
  
  
});
console.log(valuesArray);
return valuesArray;

 

전체 코드를 보면 맨 위에 getValues 라는 함수가 있고 그 안에서 map 함수 콜백으로 코드를 쓰고 있었는데

쓰다보니 주석처리하고~ 코드가 밑으로 내려가고~ 머리가 복잡해지고~~ 해서 getValues함수의 인자로 key를 받고는

사용하지 않았다는걸 잊고있었다.

그래서 삼항연산자를 맨 아래 최종풀이코드 처럼 수정하고 아주 간단하게 끝났다.

const getValues = (todos, key) => {
  const valuesArray =  todos.map((todo) => {
        typeof(todo.id) === 'number' ? todo.id : 
      (typeof(todo.content) === 'string') ? todo.content :
     (typeof(todo.completed) === 'boolean') ? todo.completed : todo;

  });
   console.log(valuesArray);
  // return valuesArray;
}

 

 

 

 

 

 

 

 

 

최종풀이코드

// getValues
const getValues = (todos, key) => {
 //return todos.flatMap(todo => key === 'id' ? [todo.id] :
  //(key === 'content' ? [todo.content]: key === 'completed' ? [todo.completed] : key) );	
  
  return todos.map(todo => key === 'id' ? todo.id :
    (key === 'content' ? todo.content : key === 'completed' ? todo.completed : key));
}

const todos = [
  { id: 3, content: 'HTML', completed: false },
  { id: 2, content: 'CSS', completed: true },
  { id: 1, content: 'Javascript', completed: false },
];

console.log(getValues(todos, 'id')); // [3, 2, 1]
console.log(getValues(todos, 'content')); // ['HTML', 'CSS', 'Javascript']
console.log(getValues(todos, 'completed')); // [false, true, false]

 

 

 


*배열안 객체 찾기 [  {~~}, {~~}, {~~}  ]

 

예제

const todos = [
  { id: 3, content: 'HTML', completed: false },
  { id: 2, content: 'CSS', completed: true },
  { id: 1, content: 'Javascript', completed: false },
];

 

 

1. 배열안 첫번째 객체 키 찾기

  const keyId = Object.keys(todos[0])[0] //id
  const keyCon = Object.keys(todos[0])[1] //content
  const keyComple = Object.keys(todos[0])[2] //completed

 

 

2. 배열안 첫번째 객체 키의 값 찾기

console.log(Object.values(todos)[0].id); //3

 

 

 

 

 

 

 

반응형
Comments