2017-07-31 38 views
0

私はRamdaで遊んだばかりです。再帰的なdissocPath

私はinitialStateを持っています。オブジェクトのネストされたキーを削除するように求めるアクションが表示されます。これは、そのレベルの唯一のキーであれば、1つ上のレベルのキーを再帰的に削除する必要があります。

const initialState = {'a': {'x': {}, 'b':{'c': {'d': {}}}}} 

const actionPath = ["a", "b", "c", "d"] 
const actionObj = {'a': {'b':{'c': {'d': {}}}}} 

//required output {'a': {'x': {}}} 

私はRamda機能のみでこれをやってみましたが、スタックを絶えず爆破しました。私はこの機能をどうやって行うのかについては迷っています。

スタートactionPathでオブジェクトを削除して

const newState = R.dissocPath(actionPath, initialState) //{'a': {'x': {}, 'b':{'c':{}}}}} 

次のキーアップが

R.isEmpty(R.equals(R.path(newPath, newState), {})) 

空の場合、それが本当dissocだ場合、

const newPath = R.init(actionPath) //const actionPath = ["a", "b", "c"] 

チェックactionPathを上に移動再度空でない限り繰り返す。 この時点から、あなたの状態に変わります。そして、あなたがチェックし、最後のステップで

{'a': {'x': {}, 'b':{}}}} 
{'a': {'x': {}}}} 

R.isEmpty(R.path(['a'], newState)) 

それはfalseを返す必要があります。

私はあなたが機能作成することができる機能

+0

もう少し説明できますか?なぜあなたはxを保ちたいが、bを保たないのか? –

+0

明瞭にするために編集されました – Luke

答えて

0

にこれを有効にする方法だけでわからないよ:フルパスで

  1. 通話dissoc
  2. スライスの最後の項目までのパスを
  3. コール自体が再帰的に限りの項目があるよう

Mighを残しました私もその任意の他の便利なRAMDAユーティリティがあるかどうかわからないなど、あなたはおそらくそれをカレー、(空のパスのようなエッジケースを扱う)いくつかのものをきれいにしたいと思います

const initialState = {'a': {'x': {}, 'b':{'c': {'d': {}}}}} 
const actionPath = ["a", "b", "c", "d"]; 

const emptyPath = (aPath, obj) => { 
    if (isEmpty(path(aPath, obj), obj)) { 
    obj = dissocPath(aPath, obj) 
    }; 

    return aPath.length > 1 
    ? emptyPath(aPath.slice(0, -1), obj) 
    : obj; 
}; 

emptyPath(actionPath, initialState); 

:トンのようなものを見て私はライブラリをよく知らないので、あなたを助けることができます。

hereこのコードを試すことができます。