중복 값 카운트 하는 스크립트에 대한 질문입니다.


(Kimwoosuk) #1

let people = [‘billyBobs’, ‘Ggg’, ‘jung’, ‘billyBobs’, ‘aaaaaaaaaaaaaaaaaaaa1404’, ‘bhavin111’, ‘asda’, ‘sarewqr’, ‘shubhamoiuhg’, ‘testGirish20’, ‘sawqweqwe’, ‘billyBobs’];
let a = {};

people.forEach(key => {
a[key] = a[key] ? a[key] +1 : 1
})
let d = people.reduce((obj, t) => (obj[t] = obj[t] ? obj[t]+1 : 1, obj),{});

두가지 코드인데요.

  1. forEach에서 로직인데요 처음에 a[key] 시작되면 아무것도 없으니 a[‘billyBobs’] key가 되고 1이 value 가 되는데 let a = [] 되고 let a = {} 여도 되더라구요 key,value로 들어오면 {} 오브젝트로 만들어야 할꺼 같은데요 둘다 사용이 가능한건가요
  2. reduece에 false일때 1, obj 의 의미가 어떻게 되는건지 궁금합니다.

(Owen Jeon) #2
  1. 배열은 Object로 부터 확장되었기 때문입니다. 심지어 함수도 될겁니다.

  2. 삼항연산자는 콤마 전에 끝나고, 뒤의 obj는 콜백 함수의 리턴값입니다. 자바스크립트 코드의 처리순서를 활용한 문법입니다.


(Kimwoosuk) #3

2에서 1,obj 가 어떤 형태로 콜백이 되는지 잘 몰라서요 혹시 자세히 설명해 주실수 있을까요


(Woojun Choi) #4

let d = people.reduce((obj, t) => {
obj[t] = obj[t] ? obj[t]+1 : 1
return obj
} ,{})

이게 맞는것 같구요

false일때는 obj[t] === undefined를 의미합니다 그때는 1을 집어넣고 그렇지 않으면 미리 존재하고 있던 obj[t]값에 1을 더 한다는 의미겠죠.

콜백함수에서의 첫번째 인자는 reduce 메소드의 두번째 인자를 의미합니다. 만약 두번째 인자가 존재하지 않으면 배열 첫번째 엘리먼트가 콜백함수의 첫번째 인자가 되고요.

예를 들어 [1,2,3,4,5] 라는 배열이 있으면 reduce의 첫번째 iteration 결과물은
{ 0 : 1 }(첫번째 obj값) 일겁니다. 그 이후는 { 0 : 1, 1: 2 } (두번째 obj값) 일거구요. 질문자님의 질문에서 obj는 iteration에서 계속 사용되고 마지막에는 리턴되는 값 입니다.