객체

Creating the dots·2021년 6월 29일
0

Javascript

목록 보기
9/24

객체 다루기

  • delete 객체의 속성 삭제하기
//syntax 
delete obj['property']
delete obj.property

//return 
속성을 삭제하면 true, 삭제할 수 없는 경우 false 리턴
console.log(delete obj.property); //true 

//Object.defineProperty()로 추가한 속성은 기본적으로 불변한다.
var Employee = {};
Object.defineProperty(Employee, 'name', {configurable: false});
console.log(delete Employee.name);  //false

//var,let,const로 선언된 변수는 non-configurable 속성으로 구분되어 delete로 삭제되지 않는다.

//strict mode에서는 false가 아니라 Syntax Error를 발생시킨다.
  • Object.keys(obj) 객체의 모든 속성 배열로 나열하기
//syntax
Object.keys(obj) 

//return
속성의 이름을 배열로 리턴
const arr = {
  name: 'coding',
  age: 30,
  city: 'seoul'
}
Object.keys(arr); //["name","age","city"]
Object.keys(arr).length; //3 ---> 속성의 갯수를 알 수 있다

객체를 입력받아 객체의 열거가능한 모든 속성을 문자열의 형태로 배열로 리턴한다

객체와 반복문

  • in 연산자
//syntax
property in obj

//return
객체 안에 속성이 있으면 true, 없으면 false 리턴

//배열과 사용된 경우, 배열의 인덱스 in 배열의 형태로 써야한다
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
0 in trees         // true
3 in trees         // true
(1 + 2) in trees   // true. 연산자 우선 순위에 의하여 이 구문의 괄호는 없어도 됨
6 in trees         // false
"bay" in trees     // false. 배열의 내용이 아닌, 인덱스 값을 명시해야함
"length" in trees  // true. length는 Array(배열) 객체의 속성이기 때문
  • for in 반복문
//syntax
for(variable in obj)

객체에서 문자열로 키가 지정된 모든 열거 가능한 속성에 대해 반복한다. (Symbol로 키가 지정된 속성은 무시) for...in은 Array에서 반복을 위해 사용할 수 없다. 배열의 인덱스는 정수로 된 열거 가능한 속성이며, 일반적인 객체의 속성들과 같다. for...in 반복문은 정수가 아닌 이름 가진 속성, 상속된 모든 열거 가능한 속성들을 반환하는데, 구현에 따라 반복 순서가 달라진다. 따라서 반복할 때 방문의 순서가 중요한 배열의 경우, for 반복문 또는 forEach(), for...of 사용을 권장한다.

//Object.entries(obj)
//for...in과 같은 순서로 주어진 객체의
//enumerable 속성(for in 을 통해 객체의 속성이 보이는지 여부를 enumerable 속성)
//[key,value]쌍의 배열 리턴.
//반환된 배열의 순서는 객체가 정의된 방법과 관련없음.
//배열 순서가 중요하면, 먼저 정렬해야함.

getLastElementOfProperty

객체와 키를 입력받아 키에 해당하는 값이 배열인 경우, 마지막 요소를 리턴한다.

//방법1
function getLastElementOfProperty(obj, property) {
  
  let arr = obj[property];
  
  if(Array.isArray(arr))
  {
    return arr[arr.length-1];
    //빈 배열이거나 배열에 포함되지 않은 인덱스를 불러오면 undefined를 리턴함
  }

  return undefined;
}

//방법2
function getLastElementOfProperty(obj, property) {
  
  let arr = obj[property];
  
  if(!Array.isArray(arr) || arr.length===0)
  //if(Array.isArray(arr)===false || arr.length===0)으로도 쓸 수 있음
  //배열이 아니거나 또는 빈 배열인 경우 undefined 리턴 
   
  {
    return undefined;
  }
  
  //그 외의 경우는 배열의 마지막 값 리턴
  return arr[arr.length-1];
  
}

getValueOfNthElement

배열과 수를 입력받아 수가 가리키는 인덱스에 해당하는 객체의 'name' 속성값을 리턴해야 합니다.

function getValueOfNthElement(arr, num) {
  //arr[num]에 해당하는 객체의 name 속성 벨류를 리턴한다
  if(arr.length===0) 
  //if(!arr.length)으로 쓸 수 있음.
  //arr.length===0인 경우, !0===true이므로 중괄호 안의 코드가 실행된다.
  {
    return 'no name';
  }
  else if(num>=arr.length)
  {
    return arr[arr.length-1].name;
  }
  return arr[num].name;
  
}

extend

두 개의 객체를 입력받아 두번째 객체의 속성들을 첫번째 객체에 추가해야 한다.

//방법1
function extend(obj1,obj2){
  
  for(let key in obj2)
  {
    if(!obj1[key]) //!undefined === true 즉, obj1에 key가 없을때 중괄호 속 코드 실행된다
    {
      obj1[key] = obj2[key];
    }
  
}

//방법2
function extend(obj1,obj2){

  for(let key in obj2)
  {
    if(!(key in obj1)) 
    //in 연산자를 활용하여 obj1에 key가 있는지 확인하여 없을 경우 중괄호 속 코드 실행
    {
      obj1[key] = obj2[key];
    }
  }
  
}
  

mostFrequentCharacter

문자열을 입력받아 가장 많이 반복되는 문자(letter)를 리턴해야 한다.

//방법1
function mostFrequentCharacter(str){
  
  let obj = {
    mostFrequentNum: 0,
    mostFrequentChar: ''
  };
  
  //기존 문자열이 빈 문자열이었다면, 빈 문자열 리턴
  if(str.length===0)
  {
    return "";
  }
  
  //시작부터 문자열의 모든 공백을 제외한 새로운 문자열을 저장한다
  let newStr = str.split(" ").join("");
  
  for(let i=0;i<newStr.length;i++)
  {
    if(!obj[str[i]]) //if(!(str[i] in obj))
    {
      obj[str[i]] = 0;
    }
    obj[str[i]]++;
    
    if(obj.mostFrequentNum < obj[str[i]])
    {
      obj.mostFrequentNum = obj[str[i]];
      obj.mostFrequentChar = str[i];
    }
    
  }
  
  return obj.mostFrequentChar;
  
}

//방법2
function mostFrequentCharacter(str){
  let obj = {
    mostFrequentNum: 0,
    mostFrequentChar: ''
  };
  
  for(let i=0;i<str.length;i++)
  {
    if(str[i]===' ')
    {
      continue; //str[i]가 빈 문자열이라면 반복문의 i++로 돌아간 후 반복문 이어서 실행
    }
    if(!obj[str[i]])
    {
      obj[str[i]] = 0;
    }
    obj[str[i]]++;
    
    if(obj.mostFrequentNum < obj[str[i]])
    {
      obj.mostFrequentNum = obj[str[i]];
      obj.mostFrequentChar = str[i]; 
    }
  
  }
  return obj.mostFrequentChar;
}
profile
어제보다 나은 오늘을 만드는 중

0개의 댓글