연습 17
두 개의 콜백과 하나의 값을 허용하는 교환 함수를 만듭니다. commutative는 값을 첫 번째 함수로 전달한 다음 결과 출력을 두 번째 함수로 전달하면 함수의 순서가 반대로 된 동일한 작업과 동일한 출력을 생성하는지 여부를 나타내는 부울을 반환합니다 (값을 두 번째 함수로 전달). , 출력을 첫 번째 함수로 전달).
https://dev.to/ryanameri/mastering-hard-parts-of-javascript-callbacks-iv-3ioe
const multBy3 = (n) => n * 3;
const divBy4 = (n) => n / 4;
const subtract5 = (n) => n - 5;
console.log(commutative(multBy3, divBy4, 11));
참으로 기록해야 한다
console.log(commutative(multBy3, subtract5, 10));
거짓으로 기록해야 한다
console.log(commutative(divBy4, subtract5, 48));
거짓으로 기록해야 한다
솔루션 17
function commutative(func1, func2, value) {
return func1(func2(value)) === func2(func1(value)) ? true : false;
}
설명이 벅차게 보일 수 있지만 일단 자세히 살펴보면 실제로는 다소 간단한 연습이라는 것을 알게 될 것입니다.
콜백에 대한 좋은 이해가 필요합니다 (이 모든 것의 핵심입니다!). 질문은 다음과 같습니다. 값을 첫 번째 함수에 전달하면 결과가 두 번째 함수에 전달되는 것과 같습니까?
이와 같은 간단한 문에 삼항 연산자를 사용하면 코드를 간결하고 읽기 쉽게 만들 수 있습니다. 첫 번째 피연산자 앞에 statemtn을 반환해야 합니다.
연습 18
객체와 콜백을 받는 objFilter 함수를 만듭니다. objFilter는 새 객체를 만든 다음 콜백에 대한 입력으로 각 키를 사용하여 전달 된 객체를 반복해야 합니다. 콜백의 출력이 해당 값과 같으면 해당 키-값 쌍이 새 객체에 복사됩니다.
objFilter는이 새 개체를 반환합니다.
const startingObj = {};
startingObj[6] = 3;
startingObj[2] = 1;
startingObj[12] = 4;
const half = (n) => n / 2;
console.log(objFilter(startingObj, half));
{2 : 1, 6 : 3}을 기록해야 합니다.
해결책 18
function objFilter(obj, callback) {
const newObj = Object.create(null);
for (let [key, value] of Object.entries(obj)) {
if (value === callback(parseInt(key))) newObj[key] = value;
}
return newObj;
}
다시 한 번 객체가 함수에 전달되기 때문에 for 루프를 사용하는 것이 Array 메서드 보다 더 쉽다는 것을 알았습니다.하지만 후자가 확실히 가능합니다.
여기서 명심해야 할 중요한 점은 객체 속성이 숫자 일지라도 문자열로 저장된다는 것입니다. 따라서 비교를 수행 할 때 엄격한 동등성이 통과하는지 확인하기 위해 올바른 유형 (parseInt() 사용)으로 캐스트 해야 합니다.
연습 19
배열 (함수)과 값을 허용하는 함수 등급을 만듭니다. 배열의 모든 함수는 true 또는 false를 반환합니다. rating은 값이 입력으로 사용될 때 true를 반환하는 배열에서 함수의 백분율을 반환해야 합니다.
const isEven = (n) => n % 2 === 0;
const greaterThanFour = (n) => n > 4;
const isSquare = (n) => Math.sqrt(n) % 1 === 0;
const hasSix = (n) => n.toString().includes("6");
const checks = [isEven, greaterThanFour, isSquare, hasSix];
console.log(rating(checks, 64));
100을 기록해야 합니다.
console.log(rating(checks, 66));
75를 기록해야 합니다.
해결책 19
function rating(arrOfFuncs, value) {
let trueCnt = arrOfFuncs.reduce((accum, fn) => {
if (fn(value)) accum++;
return accum;
}, 0);
return (trueCnt / arrOfFuncs.length) * 100;
}
함수 배열은 처음에는 약간 겁이 날 수 있지만 배열 일 뿐입니다! 그래서 우리는 배열을 가져오고 배열에서 단일 값을 계산하기를 원합니다 (함수가 참을 반환 한 횟수). 그래서 우리는 다시 reduce를 보고 있습니다! 예이!
여기서 accum은 처음에 0으로 설정되고 배열 내부의 함수가 true를 반환 할 때마다 이를 증가 시킵니다. 마지막으로 배열의 크기를 기반으로 빠른 계산을 수행하여 이 개수를 백분율로 변환하고 반환합니다.
연습 20
배열 (함수)과 값을 받는 함수 파이프를 만듭니다. 파이프는 배열의 첫 번째 함수에 값을 입력 한 다음 해당 함수의 출력을 두 번째 함수의 입력으로 사용하고 해당 함수의 출력을 세 번째 함수의 입력으로 사용하는 식입니다. 배열에 있는 마지막 함수의 출력. 파이프는 최종 출력을 반환해야 합니다.
const capitalize = (str) => str.toUpperCase();
const addLowerCase = (str) => str + str.toLowerCase();
const repeat = (str) => str + str;
const capAddlowRepeat = [capitalize, addLowerCase, repeat];
console.log(pipe(capAddlowRepeat, "cat"));
'CATcatCATcat'을 기록해야 합니다.
솔루션 20
function pipe(arrOfFuncs, value) {
return arrOfFuncs.reduce((accum, fn) => {
return fn(accum) || fn(value);
}, "");
}
처음에는 이 운동이 어렵다는 것을 인정합니다. 트릭은 reduce 내부의 콜백 함수에 있습니다. 줄 return fn (accum) || fn (값); 의미 fn (accum) return fn (accum) else return fn (value)하지만 이 압축 된 형식은 || 운영자는 오픈 소스 프로젝트에서 많이 사용했기 때문에 초보자의 눈에는 더 설명적인 형식이 더 읽기 쉬운 경우에도 여기에서 사용하기로 결정했습니다.
reduce의 초기 누적은 빈 문자열입니다. fn (accum)이 비어 있으면 fn (value)에 할당합니다. 연속 호출에서 fn (accum)은 true를 반환하므로 새 값이 반환 됩니다.
등록된 댓글이 없습니다.