Map to JSON

어떻게 하면 Map 객체를 JSON형태로 보낼 수 있을까.

시행착오

  1. 순차

      for([key,value] of db){
        res.json(value);
        //console.log(db);
      }
    

    ⚠️ 에러 발생

    →error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

    • 서버가 클라이언트에게 둘 이상의 응답을 보내려고 해서 발생하는 오류. 즉, 요청을 for문으로 여러 번 보내서 에러가 발생함.
    1. forEach()로 돌아서 새 객체에 값을 매핑하여 보내기
    let yotubers = {};
    
    db.forEach((value, key) => {
      youtubers[key] = value;
    });
    res.json(yotubers);
    
  2. 바로 객체를 JSON으로 보내기.

    res.json(value);
    
    /*
    
    {} <- 객체가 찍히지 않는다.
    즉, json이 표현할  있도록 변환해줘야 함.
    
    */
    
  3. Object.fromEntries() 사용

    • Object.fromEntries(array): 배열→ 객체 키,값으로 구성된 배열 형태를 객체로 변경한다.
    • Object.entries(obj): 객체→ 배열 객체를 배열로 만들며 이때 key와 value는 순서를 가지게 된다.
    • javascript map to json 이라고 치니 나온 글을 참고했다.

      https://medium.com/@glasshost/how-to-convert-a-map-to-json-in-javascript-b8a6ae3abedd

    여기서 JSON.stringify() 를 써서 바꿔주기까지 했는데 이러면

    "{\"1\":{\"channelTitle\":\"hongsi 홍시\",\"sub\":\"57.8만명\",\"videoNum\":338}}"
    

    이렇게 뜨므로 적용하지 않았다.

    • 같은 내용이 stack overflow에도 나온다. https://stackoverflow.com/questions/37437805/convert-map-to-javascript-object
    
    app.get('/youtubers',(req,res)=>{
    const allyoutuber = Object.fromEntries(db);
    res.json(allyoutuber);
    console.log(db);
    
    
    /*
    
        "1": {
            "channelTitle": "hongsi 홍시",
            "sub": "57.8만명",
            "videoNum": 338
        }
        */
    

Map

let class = new Map([
	['name':'english Class',
		'people':13,
		'date':' '4month'

])

class.set(key, value);

Map과 array 구분

  • 단순히 생각나도 이해한건, array는 인덱스가 숫자, map은 문자열도 가능한 배열.
    • 그래서 map 선언 시, 2차원 배열 처럼 넣는 듯 하다.
    • 둘 다 순서가 있다는 것도 맞음.
  • VS 객체
    • 순서가 없는 키,값으로 이루어진 덩어리.

객체 → Map, array : Object.entries(obj)

  • 객체가 들어가서 entries

Map, array→ 객체 : Object.fromEntries(arr)

  • 객체로 변환되어 들어가니 from 붙이기.

forEach() vs map()

array에 쓰면, value, index, all(array에 있는 모든 값)을 보여준다.

//forEach()

const arr = [1, 2, 3, 4, 5];

arr.forEach(function (value, index, all) {
  console.log(`index: ${index}, value:${value}`);
  return value * 2; //undefined
});

let new_class = new Map([
  ["name", "english Class"],
  ["people", 13],
  ["date", "4month"],
]);

new_class.set("location", "d-4");

new_class.forEach(function (value, key) {
  console.log(`key: ${key}, value:${value}`);
});

//map()
arr.map(function (value, index, all) {
  console.log(`index: ${index}, value:${value}`, all);
  return value * 2; //값이 2배로 되어 반환된다.
});