2016-09-16 69 views
1

是否在Immutable.JS中的任何功能如何從Map中刪除多個關鍵字?從Immutable.js中刪除多個嵌套關鍵字的最佳方法是什麼?

可以說,我想刪除所有嵌套鍵c0c1c2在這個例子中,不可變的映射:

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' }}, 
}); 

有沒有什麼簡單純粹的方式該怎麼做?

我的解決辦法是這樣的:

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']); 

此外,當您進行多次突變可能是有益使用withMutations

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

參考文獻:

+0

哦!太好了,我沒有注意到我們可以鏈接不可變的方法。同樣感謝你用'withMutations()' 但我認爲你不正確的事情,我們不需要檢查路徑是否存在 - 至少'deleteIn'引發錯誤'未捕獲的錯誤:無效的keyPath' 。 你可以試試:https://codepen.io/webmato/pen/bwZjPa?editors=0012 – webmato

+0

@webmato「但是我覺得你是不正確的,我們不需要檢查路徑是否存在」 - - 好吧,它很複雜:''a3:{b:'B'},'當你deleteIn(['b','c1'])'因爲'b'甚至不是一個對象而失敗。我認爲這個例子的根本問題是對象的未知形狀。我相信如果你更嚴格地塑造你的數據結構,你就不需要所有這些不必要的檢查。否則,是的,你必須檢查。 – zerkms

相關問題