술어에 대한 선호
3864 단어 functionaljavascript
술어
EQ(같음)
const EQ = x => y => x === y
ES6 화살표 기능에 익숙하지 않은 사람을 위해:
EQ
는 x
평가 결과를 반환하는 하나의 인수( y
)를 받는 다른 함수를 반환하는 인수( x === y
)를 받는 함수입니다.다음은 동등한 표준
function
def입니다.function EQ (x) {
return function (y) {
return x === y
}
}
IN(에 포함된다)
const IN = (...xs) => x => xs.includes(x)
IN
는 xs
평가 결과를 반환하는 하나의 인수( x
)를 받는 다른 함수를 반환하는 배열( xs.includes(x)
)에 수집된 하나 이상의 인수를 받는 함수입니다.논리 연산자
const NOT = pred => x => !pred(x)
const AND = (...preds) => x => preds.reduce((acc, pred) => acc && pred(x), true)
const OR = (...preds) => x => preds.reduce((acc, pred) => acc || pred(x), false)
하는 일
스칼라 배열 필터링
const data = [ 1, 2, 1, 1, 3, 2, 2, 2 ]
모든 1초 가져오기
>> data.filter(EQ(1))
Array(3) [ 1, 1, 1 ]
1초와 2초 모두 가져오기
>> data.filter(IN(1, 2))
Array(7) [ 1, 2, 1, 1, 2, 2, 2 ]
>> data.filter(OR(EQ(1), EQ(2)))
Array(7) [ 1, 2, 1, 1, 2, 2, 2 ]
객체 배열 필터링
위의
EQ
및 IN
술어 함수는 스칼라 값(예: 숫자, 부울 등)과 잘 작동하지만 객체에서 작동하는 무언가가 필요했습니다.const OBJ = spec => obj => Object.entries(spec).reduce((acc, [k, pred]) => acc && pred(obj[k]), true)
OBJ
는 키 이름을 술어에 매핑하는 객체 유형spec
인수를 허용합니다.예를 들어,
spec
값은 다음과 같습니다.{ isAdmin: EQ(true), active: EQ(true) }
isAdmin = true
AND active = true
가 있는 개체와 일치합니다. AND
이외의 논리 연산을 수행하기 위해 별도로 지정하고 적절하게 래핑할 수 있습니다. 예를 들어 동일한 속성 값에 대해 OR
쿼리를 수행하려면 다음을 수행합니다.OR( OBJ({ isAdmin: EQ(true) }), OBJ({ active: EQ(true) }) )
OBJ_OR
또는 무언가를 만드는 것이 더 나을 수 있지만 ... 계속JSONPlaceholder에서 합법적인 데이터 가져오기
const Todos = await (await fetch("https://jsonplaceholder.typicode.com/todos")).json()
반환된 배열은 다음과 같습니다.
[
{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false
},
...
]
사용자 1과 2의 완료되지 않은 모든 할 일 찾기:
>> Todos.filter(OBJ({userId: IN(1, 2), completed: EQ(false)}))
Array(21) [ {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, … ]
🎉
단순함을 위해 생략된 최적화
AND
또는 OR
에서 각각 false
및 true
를 단락시킵니다. EQ
지원(예: { isAdmin: true }
는 { isAdmin: EQ(true) }
로 해석됩니다. Reference
이 문제에 관하여(술어에 대한 선호), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/derekenos/predilection-for-predicates-3ji3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)