앞서 학습한 함수형 프로그래밍 - 1의 연습을 더 해보자.
// 입력값 array를 SquadSet집합(중복값제거)으로 만들어 주는 함수
const makeSuqadSet = (array) => array.filter((v, i) => array.indexOf(v) === i);
// 집합 A와 B의 합집합 리턴 함수
const sum = (A, B) => A.concat(B).filter((v, i) => A.indexOf(v) === i);
// 집합 A와 B의 차집합 리턴 함수
const complement = (A, B) => A.filter((v) => !B.includes(v));
// 집합 A와 B의 교집합 리턴 함수
const intersection = (A, B) => A.filter((v) => B.includes(v));
const resultAll = () => {
const setA = makeSuqadSet([1, 1, 2, 2, 2, 3]);
const setB = makeSuqadSet([1, 3]);
intersection(setA, setB);
sum(setA, setB);
complement(setA, setB);
console.log(
`A 집합 = [${setA}]\nB 집합 = [${setB}]\n합집합 = [${sum(
setA,
setB
)}]\n차집합 = [${complement(setA, setB)}]\n교집합 = [${intersection(
setA,
setB
)}]`
);
};
resultAll();
// 입력값 Array를 countSet집합({key : value})으로 만드는 함수
const makeCountSet = (array) =>
array.reduce((acc, v) => {
acc[v] = (acc[v] || 0) + 1;
return acc;
}, {});
// 객체 형태의 countSet을 배열로 만드는 함수
const objectToArray = (object) =>
Object.entries(object).flatMap(([key, value]) =>
Array(value).fill(Number(key))
);
// countSet에 {key : value} 요소를 추가하는 함수
const append = (A, elements) => makeCountSet(A.concat(objectToArray(elements)));
// countSet에 {key : value} 요소를 제거하는 함수
const remove = (A, elements) => {
const removedA = [...A];
objectToArray(elements).map((v) => {
if (removedA.indexOf(v) > -1) {
removedA.splice(removedA.indexOf(v), 1);
}
});
return makeCountSet(removedA);
};
// countSet의 특정 요소 count를 반환하는 함수
const countFor = (A, element) => makeCountSet(A)[element];
// countSetA 와 counstSetB의 합집합
const sum = (A, B) => makeCountSet(A.concat(B));
// countSetA 와 counstSetB의 차집합
const complement = (A, B) => {
const complementA = [...A];
B.map((v) => {
if (complementA.indexOf(v) > -1) {
complementA.splice(complementA.indexOf(v), 1);
}
});
return makeCountSet(complementA);
};
// countSetA 와 counstSetB의 교집합
const intersection = (A, B) =>
makeCountSet(
A.filter((v) => B.includes(v)).reduce(
(acc, v) => (acc.includes(v) ? acc : [...acc, v]),
[]
)
);
const resultAll = () => {
const counstSetA = [1, 1, 2, 2, 3, 3];
const counstSetB = [1, 3, 3, 3];
console.log(
`A Count집합 = ${JSON.stringify(
makeCountSet(counstSetA)
)}\nB Count집합 = ${JSON.stringify(
makeCountSet(counstSetB)
)}\n합집함sum = ${JSON.stringify(
sum(counstSetA, counstSetB)
)}\n차집합complement = ${JSON.stringify(
complement(counstSetA, counstSetB)
)}\n교집합intersect = ${JSON.stringify(
intersection(counstSetA, counstSetB)
)}\nAppend { 1: 2, 4: 1 } to A = ${JSON.stringify(
append(counstSetA, { 1: 2, 4: 1 })
)}\nremove { 1: 2, 4: 1 } to A = ${JSON.stringify(
remove(counstSetA, { 1: 2, 4: 1 })
)}\ncountFor "key : 1" of A = ${JSON.stringify(countFor(counstSetA, 1))}`
);
};
resultAll();
지연평가
배열을 객체로
배열 중복 값 개수
불변객체
객체에 key value
reduce의 활용
커링강의
뷸변성 객체
this강의