2016-05-10 6 views
0

最近Immutable.jsで作業を開始しました。参考にならない例が不足しています。変更不可能なjsマップでネストされた更新を実行

私は、構造がこのように見える、深くネストされた変更不可能なマップを持っています。そして、私はimmutable.jsを使って、id '264'の章のページデータを更新する必要があります。

var publisherData = { 
"id": 367, 
"publisher": { 
    "author": { 
     "id": 13, 
     "books": [ 
      { 
       "id": 13, 
       "sections": [ 
        { 
         "id": 49, 
         "chapters": [ 
          { 
           "id": 262, 
           "pages": null 
          }, 
          { 
           "id": 263, 
           "pages": null 
          }, 
          { 
           "id": 264, 
           "pages":null 
          }, 
          { 
           "id": 265, 
           "pages": { 
            "id": 159 
           }, 
          } 
         ] 
        }, 
        { 
         "id": 50, 
         "chapters": [ 
          { 
           "id": 266, 
           "pages": null 
          }, 
          { 
           "id": 267, 
           "pages": null 
          }, 
          { 
           "id": 268, 
           "pages": null 
          }, 
          { 
           "id": 269, 
           "pages": null 
          }, 
          { 
           "id": 270, 
           "pages": null 
          }, 
          { 
           "id": 271, 
           "pages": null 
          }, 
          { 
           "id": 272, 
           "pages": null 
          } 
         ] 
        }, 
        { 
         "id": 51, 
         "chapters": [ 
          { 
           "id": 273, 
           "pages": null 
          } 
         ] 
        }, 
        { 
         "id": 52, 
         "chapters": [ 
          { 
           "id": 277, 
           "pages": null 
          } 
         ] 
        } 
       ] 
      } 
     ] 
    } 
} 

私はこのコードを使用して、関連するmoduleIndexとsectionIndexを得ることができた -

immutableStub.getIn(["publisher","author", "books"]).map((module,i) => { 
    return module.get('sections').map((section,j) => { 
    return section.get('chapters').map((chapter,k) => { 
     if(chapter.get('id') == '273'){ 
     moduleIndex = i; 
     sectionIndex = j; 
     chapterIndex = k; 
     } 
    }) 
    }) 
}) 

私はここから進むことができますどのように? keyPathは部分的に「publisher」、「author」、「books」のように部分的にしか伸びないので、「updateIn」は使用できません。

解決策をご提案ください。あなたは、ほとんど存在し

+0

?本の注文は重要ですか?この特定の例では – hazardous

+0

であり、本は1つしかない。しかし、それは多くのことでした。 – Deadfish

+0

複数の書籍でも、あなたはいつも一意のIDを持つので、マップはここではIMOで動作するはずです。 – hazardous

答えて

1

...あなたがダウンマップのすべての方法を使用することもできたときに、著者の後に、あなたが書籍のリストを使用している理由は、私が聞いても

immutableStub.getIn([ "publisher", "author", "books" ]).map((module, i) => { 
    return module.get('sections').map((section, j) => { 
     return section.get('chapters').map((chapter, k) => { 
      if (chapter.get('id') == '273') { 
       moduleIndex = i; 
       sectionIndex = j; 
       chapterIndex = k; 
       chapterToUpdate = chapter; 
      } 
     }) 
    }) 
}) 
if (chapterToUpdate) { 
    // ...make changes to chapterToUpdate... 
    immutableStub = immutableStub.setIn([ 
     "publisher", 
     "author", 
     "books", 
     moduleIndex, 
     "sections", 
     sectionIndex, 
     "chapters", 
     chapterIndex 
    ], chapterToUpdate); 
} 
+0

編集のためのDeryckに感謝します! – hazardous

+0

多くのありがとう。私はこれを私の頭の周りにラップするのに問題があった – Deadfish

+0

あなたは大歓迎です。それが助けになるなら、ツリーの一部ではなく、あなたのパスをリンクリストとして考えてください:)。上のように、このリニアなパスを使って常に簡単なsetInを使用して更新することができます。私は個人的には、getIn/setInのコンボと比較して、updateInがやや不合理であることがわかります。 – hazardous

関連する問題