2017-04-10 5 views
0

http://ramdajs.com/0.21.0/docs/#propRamda를 사용하여 객체의 특정 키를 필터링하는 방법은 무엇입니까?

Ramda Repl

var myObject = {a: 1, b: 2, c: 3, d: 4}; 

var newObject = R.filter(R.props('a'), myObject); 
//var newObject = R.filter(R.equals(R.props('a')), myObject); 

console.log('newObject', newObject); 

지금 위의 전체 개체 반환 코드 : 내가하고 싶은 무엇

newObject {"a":1,"b":2,"c":3,"d":4}

그냥 단지와 새로운 개체를 반환된다 'a' 키. 또는 ab 키가있는 새 개체.

+0

원하는 키만 사용하여 개체를 원하십니까? –

답변

4

사용 pick : 필터링 기준은 단지 존재보다 더 복잡하다면

let newObj = R.pick(['a'], oldObj); 

, 당신은 임의의 술어 기능을 통해 선택 pickBy를 사용할 수 있습니다.

4

제러드 스미스의 답변은 훌륭합니다. 코드가 작동하지 않는 이유에 대한 메모를 추가하려고합니다. 당신은 당신이 prop에 대한 문서를 지적, 모든

R.filter(R.props('a'), {a: 1, b: 2, c: 3, d: 4}); 

먼저 시도했지만 props을 사용했다. 이들은 다르지만 관련된 기능입니다. (undefined에 관한 약간의 복잡성이있다.)

// prop :: k -> {k: v} -> v 
prop('c', {a: 1, b: 2, c: 3, d: 4}); //=> 3 

처럼 prop 보인다

props 다른 한편으로는 여러 값

// props :: [k] -> {k: v} -> [v] 
props(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> [1, 4] 

소요 그러나이 중 어느 것도에게 유용한 정보가 될 것입니다에 filter, 이러한 목적으로 다음과 같이 생각할 수 있습니다.

// filter :: (k -> Bool) -> {k: v} -> {k: v} 

filter의 첫 번째 매개 변수는 (문자열) 키에서 부울 값까지의 함수입니다. 그것은 Javascript의 아이디어와 함께 작동합니다. 몇 가지 특정 값을 제외하고는 모든 것이 진리입니다. 차례대로 각 키와 함께 호출됩니다. 예를 들어, {c: 3}을 포함할지 여부를 결정할 때 props('a')('c')을 호출합니다. 약간 다른 이유로 *이 실제로 작동하며 [3]을 반환합니다. 이는 진실 -y로 처리되며 필터 함수는 출력에 {c: 3}을 포함합니다. 따라서 모든 키가 포함됩니다.


* 이유 정말 props(['a'], obj)되어야 props('a', obj) 작품 JS에서 문자열이 length 속성 및 인덱스 값을 갖는리스트에 충분히 가까이있는 점이다. 'a'.length; ==> 1, 'a'[0]; //=> 'a'. 따라서 props은 단일 문자 스트링을 마치 문자 스트링의 단일 요소 목록 인 것처럼 처리 할 수 ​​있습니다. 그러나 조금 이상 할 수도 있습니다 : R.props('cabby', {a: 1, b: 2, c: 3, d: 4}); //=> [3, 1, 2, 2, undefined].