2016-09-16 4 views
1

Immutable.JS에있는지도에서 여러 키를 삭제하는 기능은 무엇입니까?Immutable.js에서 다중 중첩 키를 삭제하는 가장 좋은 방법은 무엇입니까?

const x = fromJS({ 
    a1: 'A', 
    a2: { b: { c0:'C0', c1:'C1' } }, 
    a3: { b:'B' }, 
    a4: { b: { c:'C', c1:'C1', c2:'C2' }}, 
    a5: { b: { c: { d:'D', d1:'D1' }}}, 
    a6: { b: { c2:'c2' }}, 
}); 

어떤 간단한 순수한 방법이 있나요 어떻게 할 :

내가 c0는,이 예에서 불변의 맵에서 c1, c2 모든 중첩 된 키를 삭제 싶은 말은하자?

const { fromJS, Map } = Immutable; 
 

 
const x = fromJS({ 
 
    a1: 'A', 
 
    a2: { b: { c0:'C0', c1:'C1' } }, 
 
    a3: { b:'B' }, 
 
    a4: { b: { c:'C', c1:'C1', c2:'C2' }}, 
 
    a5: { b: { c: { d:'D', d1:'D1' }}}, 
 
    a6: { b: { c2:'c2' }}, 
 
}); 
 

 
console.log(x.toJS()); 
 

 
const newX = x.map((value, key) => { 
 
    if (Map.isMap(value)){ 
 
    value = value.hasIn(['b', 'c0']) ? value.deleteIn(['b', 'c0']) : value; 
 
    value = value.hasIn(['b', 'c1']) ? value.deleteIn(['b', 'c1']) : value; 
 
    value = value.hasIn(['b', 'c2']) ? value.deleteIn(['b', 'c2']) : value; 
 
    } 
 
    return value; 
 
}); 
 

 
console.log('----------------------------'); 
 
console.log(newX.toJS());
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.js"></script>

하지만 value = value.hasIn(...도 ESLint에서 변수 재 할당을 좋아하지 않는다 :

내 솔루션이 있습니다.

답변

3

당신은 경로가 있는지 확인 할 필요가 없습니다 ("keyPath의 모든 키가 존재하지 않는 경우, 변화가 발생하지 않습니다.", 아래 링크 참조), 그래서 단순히 호출 체인

return value.deleteIn(['b', 'c0']).deleteIn(['b', 'c1']).deleteIn(['b', 'c2']); 

return value.withMutations(map => { 
    map.deleteIn(['b', 'c0']).deleteIn(['b', 'c1']).deleteIn(['b', 'c2']); 
}); 

참고 :

+0

오! 위대한, 나는 우리가 변경할 수있는 방법을 알 수 없다. 또한 withMutations()와 같이 예를 들어 주셔서 감사합니다 하지만 경로가 있는지 여부를 확인할 필요가 없다고 생각합니다. 적어도 'deleteIn'은 오류'Uncaught Error : invalid keyPath'를 throw합니다. . 시도해 볼 수 있습니다. https://codepen.io/webmato/pen/bwZjPa?editors=0012 – webmato

+0

@webmato "하지만 경로가 있는지 여부를 확인할 필요가없는 것 같아요."- - 글쎄, 복잡하다 :'a3 : {b : 'B'},'deleteIn ([ 'b', 'c1'])'b '는 객체가 아니기 때문에 실패한다. 이 예제의 근본적인 문제는 객체의 알 수없는 모양이라고 생각합니다. 나는 당신이 당신의 데이터 구조를 좀더 엄격하게 만들면 불필요한 검사를 모두하지 않아도 될 것이라고 믿습니다. 그렇지 않으면 확인해야합니다. – zerkms

관련 문제