술어에 대한 선호

3864 단어 functionaljavascript
저는 최근에 선언적 구문을 사용하여 Javascript 객체의 배열을 쿼리하고 싶었고 기쁜 마음으로 몇 가지 작은 기능을 작성할 기회를 얻었습니다.

술어



EQ(같음)




const EQ = x => y => x === y


ES6 화살표 기능에 익숙하지 않은 사람을 위해:
EQx 평가 결과를 반환하는 하나의 인수( y )를 받는 다른 함수를 반환하는 인수( x === y )를 받는 함수입니다.

다음은 동등한 표준function def입니다.

function EQ (x) {
  return function (y) {
    return x === y
  }
}


IN(에 포함된다)




const IN = (...xs) => x => xs.includes(x)

INxs 평가 결과를 반환하는 하나의 인수( 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 ]


객체 배열 필터링



위의 EQIN 술어 함수는 스칼라 값(예: 숫자, 부울 등)과 잘 작동하지만 객체에서 작동하는 무언가가 필요했습니다.

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에서 각각 falsetrue를 단락시킵니다.
  • 비 술어 함수 개체 사양 값에 대한 암시적EQ 지원(예: { isAdmin: true }{ isAdmin: EQ(true) } 로 해석됩니다.
  • 좋은 웹페이지 즐겨찾기