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

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 의 의미가 어떻게 되는건지 궁금합니다.
1개의 좋아요
  1. 배열은 Object로 부터 확장되었기 때문입니다. 심지어 함수도 될겁니다.

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

1개의 좋아요

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

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에서 계속 사용되고 마지막에는 리턴되는 값 입니다.

1개의 좋아요