TIL 7일차(20240102)

박세연·2024년 1월 2일

TIL

목록 보기
6/70
post-thumbnail

오늘의 시작은 1주차 과제 두번째!
절댓값만 있는 absolutes와 부호만 불리언으로 나타낸 signs를 이용하여 값을 합치고, 합을 구하는 문제였다.

내 정답 코드는 아래와 같다.

function solution(absolutes, signs) {
    for(let i=0;i<signs.length;i++){
        if(signs[i]==true){
            continue;
        }else{
            absolutes[i]= -absolutes[i];
            continue;
        }
    }
    let sum = 0;
    for(let i=0;i<absolutes.length;i++){
        sum +=absolutes[i];
    }
    
    var answer = 123456789;
    return sum;
}

오전동안은 자.스 문법 2주차를 수강했다. 새로 배운 것은 es6 문법, 일급 객체로서의 함수의 특징 네 가지과 map, set!

🚩 일급 객체로서의 함수의 특징 네 가지

  1. 변수에 함수를 할당할 수 있다.
    : 함수가 마치 값으로 취급된다.
  2. 함수를 인자로 다른 함수에 전달할 수 있다.
    2-1. 롤백함수: 매개변수로 쓰이는 함수
    2-2. 고차함수: 함수를 인자로 받거나 return하는 함수
  3. 함수를 반환할 수 있다.
  4. 배열의 요소로 함수를 할당할 수 있다.
    : ⭐ 이때 화살표 함수에서 this를 인식하지 못하므로 주의할 것

🚩 map

  • Key / Value로 구성
  • Key에 어떤 데이터타입(유형)도 다 들어올 수 있다.
  • Map은 키가 정렬된 순서로 지정되기 때문이다.
  • 기능: 검색, 삭제, 제거, 여부 확인
  • (map 이름).has(): key 기반 검색
  • (map 이름).size: map의 길이
  • for(const key(아니면 value) of (map이름).keys(아니면 values)()){}로 key나 value를 반복해서 출력할 수 있다.
  • for (동일양식 ~~.entries)하면 key와 value의 묶음을 볼 수 있다.

🚩 Set

  • 고유한 값을 저장하는 자료 구조.
  • 값만 저장한다
  • ⭐ 키를 저장하지 않는다
  • 값이 중복되지 않는 유일한 요소로만 구성된다
  • 값 추가, 검색, 값 삭제, 모든 값 제거, 존재 여부 확인
  • map처럼 for of로 반복할 수 있다.
  • 아래는 mdb web docs 추가 지식
교집합은 다음으로 흉내낼 수 있음
ar intersection = new Set([...set1].filter(x => set2.has(x)));

차집합은 다음으로 흉내낼 수 있음
var difference = new Set([...set1].filter(x => !set2.has(x)));

2장 과제

2시간 걸려도 답이 안나오길래 정답 코드를 참고했다.
나는 n번째 철자를 빼낸 후 그것을 기존 것의 value로 만들어서 value로 정렬하려고 했지만 세번째 부분이 작동하지 않아(자꾸 ~~.sort가 함수가 아니라고 뜬다...) 포기했다. 아래는 밸류로 저장한 것까지 완료된 코드.

function solution(strings, n) {
    let alphabet = [];
    const myMap = new Map();
    for(let i=0;i<strings.length;i++){
        alphabet.push(strings[i][n]);
        continue;
    }
    for(let i=0;i<strings.length;i++){
        //뽑은 알파벳을 각 키의 밸류로 수정
        myMap.set(strings[i], alphabet[i]); 
        continue;
        }
    //밸류값 비교해서 정렬
    var answer = [];
    return answer;
}

그리고 아래가 답안 코드. 맵으로 묶어서 새로 생성하지 않아 간결했다.

function solution(strings, n) {
    var answer = [];
    //1.문자열 가장 앞글자를 붙인 배열 만들기
    for(var i=0;i<strings.length;i++){
        strings[i]=strings[i][n] + strings[i];
    }
    //2. 해당 배열을 사전순으로 정렬 sort
    strings.sort();
    //3. 앞글자 제거 후 리턴
    for(var j=0;j<strings.length;j++){
        strings[j]=strings[j].replace(strings[j][0],"");
        answer.push(strings[j]);
    }
    return answer;
}

여기에서 중간에 삑사리가 났는데 바로 strings[i]에다 strings[i][n] + strings[i] 뒤에 원본을 붙이는 것을 깜빡했다. 정신차리자

✨ 데이터 타입

처음부터 자바와 비교한 것을 보고(숫자 입력하는데 자료형이 4가지나 되는 우리 자바...) 확실히 자바스크립트가 최근에 생겼구나라는 생각을 했다.(let만으로 8비트 사용)

  • 변수: 데이터
  • 식별자: 변수명

✨ 가변, 불변

가변은 바뀌는 것, 불변은 바뀌지 않는 것

var user = {
	name: 'wonjang',
	gender: 'male',
};

처럼 user을 만들고 user2를 생성할 때

var changeName = function (user, newName) {
	return {
		name: newName,
		gender: user.gender,
	};
};

var user2 = changeName(user, 'twojang');

처럼 새로운 객체로 만들어서 수정한다면 user2의 name만 변하고 user은 불변.


✨ 얕은 복사, 깊은 복사

얕은 복사: function을 생성한 후 그 안에 빈 배열 정의, for(var 00 in target){빈 배열[00] 안에 target[00]을 복사} 사용해서 객체의 모든 프로퍼티에 접근, 복사를 완료한 객체의 프로퍼티를 변경
깊은 복사는 재귀 함수를 사용한다. (따라서 더 깊은 경로까지 복사시킴)

var copyObjectDeep = function(target) {
	var result = {};
	if (typeof target === 'object' && target !== null) {
		for (var prop in target) {
			result[prop] = copyObjectDeep(target[prop]);
		}
	} else {
		result = target;
	}
	return result;
}

을 생성, target을 위의 재귀함수에 대입


✨ 호이스팅

profile
배워나가는 중

0개의 댓글