반응형
반응형

📝Promise

비동기 처리를 도와주는 객체로서 콜백지옥의 문제를 깔끔하게 해결해줄 수 있다 → Promise Chainning 기술을 이용
물론 남발하면 콜백 지옥이 다시 시작된다 → 잘 활용 해야한다

 

 

Promise 상태

  • Pending
    • 수행이 끝나지 않은 상태 → resolve 값이 반환이 안 된 상태
  • Reject
    • 수행을 시켰지만 실패된 상태
  • Fulfilled
    • 수행이 올바르게 끝난 상태

 

Promise 안에 비동기(일반적으로 Ajax, Fetch, Axios 등...)에 대한 내용 및 성공했을 때 반환할 내용인 Resolve와 실패했을 때 반환할 내용인 Reject가 들어가며 Then()을 이용해 비동기 내용을 실행시킨다  → Promise 선언시 바로 동작 되기 때문에 Function안에 사용하는게 일반적이다.

 

 

Promise 사용 방법 (기초)

// Promise (Async operation)
//  - get status (pending → fufilled or rejected)
//  - Producer, Consumer


/** ───── 1. Producer (Promise 객체는 선언시에 자동적으로 실행된다.) ───── **/
const promise = new Promise((resovle, reject) => { // 기본 문법 new Promise((resolve, reject) => ...
    console.log('doing something...');             // doing some heavy work
    // setTimeout(() => resovle('ellie'), 2000)    // 성공시에는 ellie라는 값 return
    setTimeout(() => reject(new Error('no network')), 2000) // 실패시 no network라는 값 return                                                            
});



/** ───── 2. Consumer (then, catch, finally) ───── **/
 promise.then(value => console.log(value))     // 성공시 ellie 출력 (then은 promise을 실행한다를 의미)
        .catch(error => console.log(error))    // 실패시 no network 출력 (Error 핸들링은 catch 사용)
        .finally(() => console.log('finally')) // 성공하든 실패하든 finally 출력 



/** ───── 3. Promise chaining ───── **/
const fetchNumber = new Promise((resolve, reject) => {
    setTimeout(() => resolve(1), 1000); // return 값 : 1
});

fetchNumber
    .then((num) => num * 2) // return 값 1을 파라미터로 1 * 2 값을 return (resolve)
    .then((num) => num * 3) 
    .then((num) => {
        return new Promise((resovle, reject) => 
             setTimeout(() => resovle(num -1), 1000)) ;
    }) // promise를 return 가능
    .then((num) => console.log(num)); // then 을 쓰려면 resolve가 있어야한다. (then 쓰고 핸들링이 있을 경우인 거 같다)

 

 

콜백지옥 (URL 통신)

/**
    @author 이성재
    @why    엔진 기동
 */
let turnOn = () => {
	
	if (confirm("검색 엔진을 기동하시겠습니까?") == true) {
		
        // 패스워드 체크     
        let adminPw = $("#admin_pw").val();
        let id = "testid";
        let shaAdminPw = hex_sha512(adminPw).toString();
        return new Promise((resolve, reject) => {
            $.ajax({
            type: "GET",
            url: "./check/password", // hecking
            data: {
                shaAdminPw: shaAdminPw, // 암호화 password
                id: id, // id
                type: 'f' // ?
            },
            success: (data) => {
                if (data !== "success") return "비밀번호가 틀렸습니다";
                
                if (data === "success") {

                    // 검색엔진 기동
                    $.ajax({
                        url: './turn-on',
                        type: 'GET',
                        success: () => { return "검색 엔진이 기동되었습니다."},
                        error:   () => { return "통신 오류가 발생했습니다."}
                    }); // ajax end	

                }
            },
            error : () => { return "패스워드 체크에 실패했습니다.";}
        }); // ajax 종료
        });
	}else {
		return false;
	}
}

 

 

Ajax Promise Chaning으로 콜백 지옥 해결 (URL 통신)

/**
    @author 이성재
    @why    엔진 기동 요청
 */
let turnOnAjax = () => {
	return new Promise((resolve,reject) => {
	$.ajax({
		url: './turn-on',
		type: 'GET',
		success: () => {resolve("검색 엔진이 기동되었습니다.")},
		error:   () => {reject("통신 오류가 발생했습니다.")}
	}); // ajax end	
	}); // promise end
}

/**
    @author 이성재
    @why    엔진 재기동에 필요한 패스워드 검사
 */

let checkPasswordAjax = () =>{
	
	let adminPw = $("#admin_pw").val();
	let id = "testid";
	let shaAdminPw = hex_sha512(adminPw).toString();
	return new Promise((resolve, reject) => {
		$.ajax({
		type: "GET",
		url: "./check/password", // hecking
		data: {
			shaAdminPw: shaAdminPw, // 암호화 password
			id: id, // id
			type: 'f' // ?
		},
		success: (data) => {
			if (data == "success") resolve("success");
			else resolve("비밀번호가 틀렸습니다");
		},
		error : () => {reject("패스워드 체크에 실패했습니다.");
		}
	}); // ajax 종료
	});
}


/**
    @author 이성재
    @why    엔진 기동
 */
let turnOn = () => {
	
	if (confirm("검색 엔진을 기동하시겠습니까?") == true) {
		
		// 패스워드 체크
		checkPasswordAjax()
		.then((message) => {
			if(message === "success") return turnOnAjax();
			else alert(message); // 패스워드 틀림
		})
		.catch((errorMsg) =>{
			alert(errorMsg);
		}) 
		// 엔진 기동
		.then((message) => {
			g_showLayer();
			alert(message);
			location.reload()	
		})
		.catch((errorMsg) =>{
			alert(errorMsg);
		})
		.finally(() => g_closeLoading)
		
	}else {
		return false;
	}
	
}

 

 

📝Async

Promise는 비동기 처리를 좀 더 가독성 및 여러가지 측면에서 효율적으로 만들어주지만 그에 대한 코드가 너무 길어서 지저분에 보일 수 있다 Async는 이를 보완해준다 Async 키워드는 Function 앞에 사용하며 해당 함수는 항상 프라미스를 반환된다

 

Asyn 기본 예제

// 1. async
async function fetchUser() {
    return 'ellie'; // async에서 return = resolve와 등치
}

const user = fetchUser(); 
user.then(console.log);   // Promise {[[PromiseState]]: 'fulfilled', [[PromiseResult]]: 'ellie', Symbol(async_id_symbol): 5, Symbol(trigger_async_id_symbol): 1}
console.log(user);        // ellie

 

Async 기본예제2

function delay(ms){
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function getApple(){
    await delay(1000);
    return 'apple';
}

async function getBanana(){
    await delay(1000);
    return 'banana';
}

function getBananaPromise(){ // getBanana Promise Version (getBanana()와 등치)
    return delay(1000)
    .then (()=>'bananaPromise')
}

let apple = getApple();  // promise pending 상태 
apple.then(console.log); // apple

getBanana().then(console.log) // banana
getBananaPromise().then(console.log); // bananaPromise

 

 

📝Await

비동기 통신이 순차적으로 이루어져야하는 경우 또는 비동기 통신한 값을 변수에 담고 싶은 경우 사용할 수 있다.

Await는 말 그대로 통신을 기다리는 것이고 Async 안에서만 사용이 가능하다 → Await는 Then()을 포함해 실행시킨다

 

 

Await 예제

function delay(ms){
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function getApple(){
    await delay(1000);
    return 'apple';
}

async function getBanana(){
    await delay(1000);
    return 'banana';
}

async function pickFruits(){ 
    const apple = await getApple();   // 1초 
    const banana = await getBanana(); // 1초
    return `${apple} + ${banana}`     
} // Total : 2초

pickFruits().then(console.log) // apple + banana

 

위와 같은 경우는 실행시 getApple()로 비동기 객체(Promise)를 가져오면서 실행이 됩니다.

Await의 역할Promise 상태가 fufilled가 될때까지 기다립니다 그리고 그 결과 값을 변수에 할당해줄 수 있습니다.

 

  • getApple을 통해 Promise를 가져오고 (pending 상태) await을 거쳐 1초 기다리고 Apple을 반환
  • getBanana을 통해 Promise를 가져오고 (pending 상태) await을 거쳐 1초 기다리고 Banana를 반환

총 2초가 걸리게 됩니다 이렇게 할 경우 순차적으로 처리가 가능하지만 병렬로 처리가 안 되기 때문에 낭비되는 시간이 생깁니다 그럴 경우 이런식으로 처리가 가능합니다. 

 

Await 개선

function delay(ms){
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function getApple(){
    await delay(1000);
    return 'apple';
}

async function getBanana(){
    await delay(1000);
    return 'banana';
}

async function pickAllFruits(){
    const applePromise = getApple();   // promise 객체 (pending)
    const bananaPromise = getBanana(); // promise 객체 (pending)
    const apple = await applePromise   // 실행 후 대기
    const banana = await bananaPromise // 실행 후 대기
    return `${apple} + ${banana}`
}

pickAllFruits().then(console.log) // apple + banana
  • applePromise = getApple()
  • bananaPromise = getBanana()

 

이 두개를 통해 각각 비동기로 먼저 호출해서 결과값을 가진 (fulfilled) Promise 를 만들도록 한 뒤 await을 통해 fullfilled 가 된 경우 그 결과값이 apple과 banana로 들어가게 됩니다 그래서 1초만에 apple + banana가 출력이 되게 됩니다.

 

 

 

📝Promise.all

Await개선에 있는 코드처럼 쓰는 경우 뭔가 중복된 느낌이 강합니다. 이 부분을 개선한 방식이 Promise.all입니다.

Promise.all의 경우 all에 등록한 Promise객체가 전부 완료될때까지 기다려줍니다

 

가독성 해치는 코드

// 가독성을 해침
async function pickAllFruits(){
    const applePromise = getApple();   // promise 객체 (pending)
    const bananaPromise = getBanana(); // promise 객체 (pending)
    const apple = await applePromise   // 실행 후 대기
    const banana = await bananaPromise // 실행 후 대기
    return `${apple} + ${banana}`
}

 

Promise.all로 개선

function delay(ms){
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function getApple(){
    await delay(1000);
    return 'apple';
}


async function getBanana(){
    await delay(1000);
    return 'banana';
}


function pickFruits(){
     return Promise.all([getApple(),getBanana()]) // promise 객체
     .then(fruits => fruits.join(' + '));
}

pickFruits().then(console.log); // apple + banana

 

 

📝Promise.race

race는 말 그대로 경주를 한다는 의미입니다. 등록된 Promise 객체중에서 먼저 종료되는 Promise만 리턴해줍니다.

 

Promise.race

function delay(ms){
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function getBananaOne(){
    await delay(1000);
    return 'banana';
}

async function getBananaTwo(){
    await delay(2000);
    return 'banana2';
}

async function getAppleOne(){
    await delay(1000);
    return 'apple';
}

async function getAppleTwo(){
    await delay(2000);
    return 'apple2';
}

function pickOnlyOne1() {
    return Promise.race([getAppleTwo(), getBananaOne()]);
}

function pickOnlyOne2() {
    return Promise.race([getAppleOne(), getBananaTwo()]);
}

pickOnlyOne1().then(console.log); // banana
pickOnlyOne2().then(console.log); // apple

 

 

Arrow Function을 이용한 async 표현법

// Arrow Function을 이용한 async 표현법
const getDog = async () => {
    await sleep(1000);
    return '멍멍이';
};

 

fetch을 이용해 json 데이터 받아오기

const fetching = fetch('https://dummyjson.com/products/1'); // fetch에 대한 내용이 들어간 Promise
const response = await fetching; // Promise 실행시킨 Response 객체 내용
// response.then()과 동일한 역할이지만 데이터를 받아온 후에 처리하려면 response.then((res)=>res.json()) 이런식 처리 필요
const data = await response.json(); // response에서 응답값 결과

 

 

🔗 참고 및 출처

https://www.youtube.com/watch?v=aoQSOZfz3vQ&t=736s

반응형
반응형
// Sync → 순차적인 실행
function sync(){
    console.log('sync callback');
    console.log('1');
    console.log('2');
    console.log('3');
    // 1 → 2 → 3
}

// Async → 순차적이지 않은 실행 (분산 처리로 속도가 빠르지만 언제 값이 내려올지 몰라 대응하기 어려움)
function async(){
    console.log('sync callback');
    console.log('1');
    setTimeout(() => console.log('2'), 1000);
    console.log('3');
    // 1 → 3 → 2
}

sync();
async();

 

 

// Callback Hell (Callback Method call Callback Method) 
// → callback 함수를 남발하여 안에 내용이 보기 힘들어진 것
class UserStorage {
    loginUser(id, password, onSuccess, onError){
        setTimeout(() => {
            if (id === 'ellie' && password === 'dream')
                onSuccess(id); // id 파라미터 값을 넘겨준다.
            else
                onError(new Error('not found')); // not found라는 에러메세지를 넘겨준다
        }, 2000);
    }

    getRoles(user, onSuccess, onError){
        setTimeout(() => {
            if (user === 'ellie')
                onSuccess()
            else
                onError(new Error('no access'));
        }, 1000);
    }
}

const userStorage = new UserStorage();
const id = 'ellie';
const password = 'dream';
userStorage.loginUser(
    id,
    password,
    success => {
        userStorage.getRoles(
            id, 
            success => console.log(`Hello ${id}`) ,
            error => console.log(error)
        )
    },
    error => console.log(error)
)

// id가 ellie 이고 password가 dream인 걸 서버에서 확인(서버 통신시간 2초라고 가정)
// 그 이후에 올바른 경우 onSuccess가 작동하고 그렇지 않으면 onError가 작동한다.
반응형
반응형
// XHR (데이터 요청과 받아올 수 있는 Object)
// XMLHttpRequest로 맨 처음 개발 당시에는 XML을 이용했지만 추후에는 여러 데이터 format으로 사용 가능
// 이름만 XML인 거지 다양한 format 사용 가능하다.
// 문자열 → Object (Serialize) 
// Object → 문자열 (Deserialize)

const rabbit = {
    name : 'tomi',
    color : 'white',
    size : 'small'
}

// JSON.stringify = String to JsonObject
let json = JSON.stringify(rabbit); // {"name":"tomi","color":"white","size":"small"}
console.log(json);

// 원하는 키만 JSON 변환 가능
json = JSON.stringify(rabbit, ['name']); 
console.log(json); // {"name":"tomi"}

// jsonObject의 forEach
json = JSON.stringify(rabbit, (key, value) => {
    console.log(`key : ${key}, value : ${value}`);
    return value; // 필수
   // return key === 'name'? 'tomi' : value; // key가 name인 경우 tomi를 넣어 return 해준다.
});

// key : , value : [object Object] // 최상위
// key : name, value : tomi
// key : color, value : white
// key : size, value : small


// jsonObject to String
const obj = JSON.parse(json);
console.log(`obj : ${obj}`) // {"name":"tomi","color":"white","size":"small"}
console.log(`name : ${obj.name}`); // name : tomi


const obj2 = JSON.parse(json, (key, value) =>{
    console.log(`key : ${key}, value : ${value}`);
    return value; 
});

// key : name, value : tomi
// key : color, value : white
// key : size, value : small
// key : , value : [object Object]
반응형
반응형

 

  • 초기값 데이터 선언
class Student {
    constructor(name, age, score){
        this.name = name;
        this.age = age;
        this.score = score;
    }
}

const students = [
    new Student('Sam', 40, 90),
    new Student('Amy', 20, 80),
    new Student('Tom', 30, 100),
    new Student('Carrot', 45, 70),
    new Student('Julia', 15, 75)
];

 

📝filter

// filter (나이가 20 이상인 사람만 출력한다.)
const oldStudents = students.filter((student) => student.age > 20);
oldStudents.forEach((student) => console.log(student));
// Student {name: 'Sam', age: 40, score: 90}
// Student {name: 'Tom', age: 30, score: 100}
// Student {name: 'Carrot', age: 45, score: 70}

필터는 말 그대로 걸러내는 작업으로 배열을 하나씩 순회하면서 조건에 맞는 것(true)만 배열에 담습니다

 

📝map

// map (모든 student score에 2를 곱한다)
const studentScores = students.map((student) => student.score * 2);
console.log(studentScores); // [180, 160, 200, 140, 150]

map의 경우 배열을 하나씩 순회하면서 각 요소에 동일하게 적용시킬 수 있습니다 예를 들면 각 배열의 숫자를 2배를 한다 등의 행동을 할 수 있습니다. forEach랑 다른 점은 새로운 배열을 반환시킬 수 있습니다 [코드 길이 감소]

 

📝some, every

// some (하나라도 만족하는 경우)
{
    const result = students.some((student) => student.score < 80);  
    console.log(result); // true 
}

// every (모두다 만족하는 경우)
{
    const result = students.every((student) => student.score < 80);  
    console.log(result); // false
}
  • some의 경우 하나라도 만족하면 true를 보내며 나머지 배열을 순회 안 하고 끝냅니다
  • every의 경우 모든게 다 만족해야 true를 보냅니다 그렇지 않으면 false를 반환합니다

 

📝reduce

// reduce (totalScore : 이전 값 ,  curr : 현재 값)
{
    const result = students.reduce((totalScore, curr) => {
        console.log(totalScore); // 0, 90, 170, 270, 340
        console.log(curr); 
        // Student {name: 'Sam', age: 40, score: 90}
        // Student {name: 'Amy', age: 20, score: 80}
        // Student {name: 'Tom', age: 30, score: 100}
        // Student {name: 'Carrot', age: 45, score: 70}
        // Student {name: 'Julia', age: 15, score: 75}

        return totalScore + curr.score; // return 값이 다음 loop의 totalScore에 들어가게 된다.
    }, 0); // 0은 초기값 
}

reduce의 경우 map하고 비슷하게 보이지만 map의 경우 앞에 있는 인덱스가 뒤에 있는 인덱스에 영향을 끼치지 않습니다 reduce의 경우 앞에 값이 뒤에 영향을 줄 수 있습니다 예를들면 모든 배열의 값을 더한다고 했을 때 0번째 인덱스와 1번째 인덱스와 더한값을 다음 배열 인덱스[2번째]가 받아서 더하고 계속적으로 반복합니다 거의 계산(합, 차 등...)하거나 할 때 많이 쓰입니다

 

 

 

 

반응형
반응형

📝Arrays, of, forEach

// Arrays
const foods = ['🍗','🍟','🍔'];
for (let indexNum = 0; indexNum < foods.length; indexNum++){
    console.log(foods[indexNum]);
}

// for of
for (let food of foods){
    console.log(food);
}

// for in
let obj = {
  a: 1,
  b: 2,
  c: 3
};

for (let item in obj) {
    console.log(item); // a b c
    console.log(obj[item]); // 1 2 3
}


/** 에러 발생 */
// for (let item of obj) {
//     console.log(item);
// }

// forEach
foods.forEach(function (food, index){
    console.log(food, index);
});

foods.forEach((food, index) => console.log(food, index));

for of의 경우 반복가능한 객체 (Array, Map, Set, String, TypedArray, arguments 객체 등을 포함)에 대해서 반복한다

for in의 경우는 객체에 사용이 가능하다

 

 

🔗 참고 및 출처

https://doozi0316.tistory.com/entry/JavaScript-for-in-for-of%EC%9D%98-%EC%B0%A8%EC%9D%B4

반응형
반응형

📝Class 클래스

// Class

class Person {
    // constructor
    constructor(name, age){
        this.name = name;
        this.age = age;
    }

    // methods
    speak(contents){
        console.log(`${this.name} : ${contents}`);
    }

    // this.age라고 쓴 경우 get age()를 호출
    get age(){
        // return this.age; 이렇게 사용시 get age()를 계속 호출
        return this._age;
    }

    // this.age에 값을 설정할 때 set age()를 호출
    set age(value){
        // this.age = value; 이렇게 사용시 set age()를 계속
        this._age = value < 0 ? 0 : value;
    }
}

const sam = new Person('Sam', 20);
console.log(sam.name);
console.log(sam.age);
sam.speak('Hello!');

JavaScript에서 클래스를 위와 같이 사용할 수 있다

 

📝Extends, Overrride

class Shape {
    
    constructor(width, height, color){
        this.width = width;
        this.height = height;
        this.color = color;
    }

    paint(){
        console.log(`painting ${this.color} color`)
    }

    draw(){
        console.log(`drawing shape`);
    }
}

class Rectangle extends Shape {
    // Overriding
    draw(){
        // super.draw(); 부모 함수 사용 가능
        console.log(`drawing Rectangle`)
    }
}

const rectangle = new Rectangle(100, 200, 'red');
rectangle.paint();
rectangle.draw();

Extends를 이용해 Class를 상속받을 수 있고 Override처럼 자식 클래스가 함수를 재정의해서 사용할 수도 있다.

 

반응형
반응형
// const printSimply = function () {console.log('you can make function simply!');}
const printSimply = () => console.log('you can make function simply!');

// const add = function (a, b) {
//     console.log(a + b);
//     console.log("end");
// }

const add = (a, b) => {
    console.log(a + b);
    console.log("end");
}

printSimply();
add(5, 4);
반응형
반응형
// logical operation
console.log('null == undefined ? ' + (null == undefined)); // true
console.log('null === undefined ? ' + (null === undefined)); // false
console.log('0 == false ? ' + (0 == false)); // true
console.log('0 === false ? ' + (0 === false)); // false
console.log('"" === false ? ' + ('' == false)); // true
console.log('"" === false ? ' + ('' === false)); // false

null == undefined == 0 == '' == false

 

반응형
반응형

📝Object (객체)

var book ={
	title : "채식주의자",
	author : "한강",
	price : "120000"
}

console.log(book.title); // 채식주의자

var book =[
	{
		title : "채식주의자",
		author : "한강",
		price : "120000"
	},
	{
	title : "육식주의자",
	author : "두강",
	price : "130000"
	}	
] // 배열 + 객체



console.log(book[0].title); // 채식주의자
console.log(book[1].title); // 육식주의자

// 객체

자바스크립트는 객체를 지정할 수 있고 속성 : 속성값으로 이루어져있습니다. 또한 배열로 여러개를 만들 수도 있습니다.

 

// Object (you can change inner value even if const)
const person  = {name : 'smith', age : 20};
console.log(`name : ${person.name}, age : ${person.age}`);
person.name = 'hommer'
console.log(`name : ${person.name}, age : ${person.age}`);

 

 

값에 직접 접근해 해당 내용의 값을 바꿀수도 있습니다.

 

📝Object Key를 변수로 할당하기 [Computed property]

// Computed property
let a = 'age';
const user1 = {
    name : 'Mike',
    // age : 30
    [a] : 30 // "키"에 변수를 할당할 수 있다
}
console.log(user1); //{ name: 'Mike', age: 30 }

const user2 = {
    [1 + 4] : 5,
    ["안녕" + "하세요"] : "Hello"
}

console.log(user2); // { '5': 5, '안녕하세요': 'Hello' }

 

📝Object 복사하기 (잘못된 버전) [주소복사]

const user = {
    name : 'Mike',
    age : 30
}
const cloneUser = user; // 주소 복사

/** 값 변화 **/
cloneUser.name = "Bob";
user.age = 10;

console.log(`name : ${user.name}, user.age : ${user.age}`);           // name : Bob, user.age : 10
console.log(`name : ${cloneUser.name}, user.age : ${cloneUser.age}`); // name : Bob, user.age : 10

그냥 = 으로 퉁쳐버리면 값이 복사가 되는게 아니라 주소가 복사됩니다. 그래서 서로에게 영향을 끼치기 때문에 생각한대로 프로그램이 안 돌아갈 수 있습니다.

 

 

📝Object 복사하기 [값 복사]

const user = {
    name : 'Mike',
    age : 30
}
const realCloneUser = Object.assign({}, user);

realCloneUser.name = "Bob";
user.age = 10;

console.log(`name : ${user.name}, user.age : ${user.age}`);                   // name : Mike, user.age : 10
console.log(`name : ${realCloneUser.name}, user.age : ${realCloneUser.age}`); // name : Bob, user.age : 30

Object.assign( ${기존 객체 값 [없을 시 {} 빈 값]}, ${복사할 값}을 이용해 값을 복사할 수 있습니다

 

📝기존 Object에 값 추가 및 덮어씌우기(overwrtie) 및 객체 합치기

const user = {
    name : 'Mike',
    age : 30
}

/** --- Clone Json Object [add] --- **/
const cloneUser1 = Object.assign({gender:'male'}, user); // 복제 + 원하는 값 추가
console.log(cloneUser1); // { gender: 'male', name: 'Mike', age: 30 }


/** --- Clone Json Object [overwrite] --- **/
const cloneUser2 = Object.assign({name:'Bob'}, user); // 복제 + 원하는 값 추가
console.log(cloneUser2); // { gender: 'male', name: 'Mike', age: 30 }


/** --- Merge Json Object --- **/
const name =  {name : 'Mike'}
const age =  {age : 40}
const gender =  {gender : 'female'}

const mergeUser = Object.assign(user, age, gender);
console.log(mergeUser); // { name: 'Mike', age: 40, gender: 'female' }

Object.assign( ${합칠 객체}, ${합칠 객체} ...을 이용해 객체를 합칠 수 있습니다

 

📝Object Key, Value 추출하기

const user = { name: 'Mike', age: 40, gender: 'female' }


/** --- Extract Json Keys, Values --- **/
const keys = Object.keys(user);
const values = Object.values(user);
console.log(keys);   // [ 'name', 'age', 'gender' ]
console.log(values); // [ 'Mike', 40, 'female' ]


/** --- Extract Json Keys + Values --- **/
const entries = Object.entries(user);
console.log(entries); // [ [ 'name', 'Mike' ], [ 'age', 40 ], [ 'gender', 'female' ] ]

 

  • Object.keys( ${키를 추출할 객체} ) 을 이용해 객체의 키를 배열로 추출할 수 있습니다.
  • Object.keys( ${값을 추출할 객체} ) 을 이용해 객체의 값을 배열로 추출할 수 있습니다.
  • Object.entries( ${키와 값을 추출할 객체} ) 을 이용해 객체의 키,값을 배열로 추출할 수 있습니다.

 

🔗 참고 및 출처

https://www.youtube.com/watch?v=6NZpyA64ZUU&list=PLZKTXPmaJk8JZ2NAC538UzhY_UNqMdZB4&index=3

반응형