// 비교 함수. 매개변수 key는 프로퍼티 키다. functioncompare(key) { // 프로퍼티 값이 문자열인 경우 - 산술 연산으로 비교하면 NaN이 나오므로 비교 연산을 사용한다. // 비교 함수는 양수/음수/0을 반환하면 되므로 - 산술 연산 대신 비교 연산을 사용할 수 있다. return(a, b) => (a[key] > b[key] ? 1 : a[key] < b[key] ? -1 : 0); }
const count = fruits.reduce((acc, cur) => { // 첫 번째 순회 시 acc는 초기값인 {}이고 cur은 첫 번째 요소인 'banana'다. // 초기값으로 전달받은 빈 객체에 요소값인 cur을 프로퍼티 키로, 요소의 개수를 프로퍼티 값으로 // 할당한다. 만약 프로퍼티 값이 undefined(처음 등장하는 요소)이면 프로퍼티 값을 1로 초기화한다. acc[cur] = (acc[cur] || 0) + 1; return acc; }, {});
// 콜백 함수는 총 5번 호출되고 다음과 같이 결과값을 반환한다. /* {banana: 1} => {banana: 1, apple: 1} => {banana: 1, apple: 1, orange: 1} => {banana: 1, apple: 1, orange: 2} => {banana: 1, apple: 2, orange: 2} */
const result = values.reduce((acc, cur, i, arr) => { // 순회 중인 요소의 인덱스가 자신의 인덱스라면 처음 순회하는 요소다. // 이 요소만 초기값으로 전달받은 배열에 담아 반환한다. // 순회 중인 요소의 인덱스가 자신의 인덱스가 아니라면 중복된 요소다. if (arr.indexOf(cur) === i) acc.push(cur); return acc; }, []);