Map to JSON, Object ...
Object.fromEntries(), Object.entries()
Map to JSON
어떻게 하면 Map 객체를 JSON형태로 보낼 수 있을까.
시행착오
-
순차
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문으로 여러 번 보내서 에러가 발생함.
- forEach()로 돌아서 새 객체에 값을 매핑하여 보내기
let yotubers = {}; db.forEach((value,key)=>{ youtubers[key] = value; }); res.json(yotubers);
- 서버가 클라이언트에게 둘 이상의 응답을 보내려고 해서 발생하는 오류.
즉, 요청을 for문으로 여러 번 보내서 에러가 발생함.
-
바로 객체를 JSON으로 보내기.
res.json(value); /* {} <- 객체가 찍히지 않는다. 즉, json이 표현할 수 있도록 변환해줘야 함. */
-
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배로 되어 반환된다.
});