2016-11-29 4 views
1

現在userオブジェクトがあります。そのオブジェクトにはcurrentRoom()メソッドがあります。存在しない場合があります。nullが返されます。Ramadaを使用しているオブジェクトのネストされたメソッドを呼び出す

currentRoom()メソッドが何かを返す場合は、その上でmessages()メソッドを呼び出す必要があります。いずれかから何も返されない場合は、デフォルトの空の配列[]を返したいと思います。

私はRamdaを使ってこの機能に機能的に取り組んでいますので、きれいで再利用可能です。現在、私の(非RAMDA)のコードは次のようになります。

const user = Users.findOne({ username: params.id }) 
const room = (user.currentRoom && user.currentRoom() || {}) 
const messages = (room.messages && room.messages() || []) 

私が考えていたロジックのいくつかの種類が何もそれから出てきていない場合は、デフォルトの結果とともに、必要なメソッドのリストを渡すことでした。

/* getMessages(defaultIfNull, methodsArray, object) */ 

getMessages([], ['currentRoom', 'messages'], user) 

基本的には、pathOrと少し似ていますが、オブジェクトのメソッドには少し似ています。

+0

ところで、 'room'のデフォルト値は'[] 'ではなく{{}'である – Bergi

+0

良い点。一定! – gosseti

答えて

5

私はOptionようListモナドを使用したいと思います:

const getRoom = user => "currentRoom" in user ? [user.currentRoom()] : []; 
const getMessages = room => "messages" in room ? room.messages() : []; 

const allTogether = R.compose(R.chain(getMessage), R.chain(getRoom), R.of); 
console.log(allTogether(Users.findOne({ username: params.id }))); 
+0

空の配列はコード内であいまいです。これは、非決定的な選択または例外を意味する場合があります。これが良いアドバイスかどうかは分かりません。 – ftor

+0

@ftor例外のために使用される配列は見たことがありませんか?空の配列は選択肢がないことを意味します。私はこれが最もクリーンな解決策ではないことに同意します(多くのアップホーセットに驚いています)、おそらく 'Option >'が良いでしょう。残念ながら、Ramdaには組み込み型のオプションはありません。 – Bergi

+0

ハハ。私はそれが好きです。恥知らずの不公平な議決権行使。 –

0

あなただけRAMDAを使用してポイントを含まない溶液を使用することができます。まず、withDefaults関数を定義します。この関数は、これらのメソッドが定義されていないオブジェクトにcurrentRoommessagesのメソッドを設定します。

var withDefaults = R.pipe(

    // if don't have `currentRom` add a 
    // `currentRom` function that returns an empty object 
    R.unless(
     R.hasIn('currentRoom'), 
     R.assoc('currentRoom', 
      R.always({}))), 

    // if don't have `messages` add a 
    // `messages` function that returns an empty array 
    R.unless(
     R.hasIn('messages'), 
     R.assoc('messages', 
      R.always([])))) 

この関数は、必要に応じてオブジェクト設定メソッドをフィルタリングします。使用例

var user = withDefaults(getById(id)) 

次に、ゲッター関数を定義して、オブジェクトから部屋とメッセージを取得します。 invokerはこのスニペットの中心部分であり、メソッドを呼び出す関数を返します。 http://ramdajs.com/docs/#invoker

var getCurrentRoom = R.invoker(0, 'currentRoom') 
var getMessages = R.invoker(0, 'messages') 

上記のコードは、次のように使用できます。すべて一緒に

var userWithRoom = withDefaults({ 
     currentRoom : function() { 
      return { 
       number : '123' 
      } 
     } 
    }) 

var userWithMessages = withDefaults({ 
     messages : function() { 
      return [ 
       'get lunch' 
      ] 
     } 
    }) 

var userWithAll = withDefaults({ 
     currentRoom : function() { 
      return { 
       number : '123' 
      } 
     }, 
     messages : function() { 
      return [ 
       'get lunch' 
      ] 
     } 
    }) 

var userWithNone = withDefaults({}) 

var withDefaults = R.pipe(
    R.unless(
     R.hasIn('currentRoom'), 
     R.assoc('currentRoom', 
      R.always({}))), 
    R.unless(
     R.hasIn('messages'), 
     R.assoc('messages', 
      R.always([])))) 

var getCurrentRoom = R.invoker(0, 'currentRoom') 
var getMessages = R.invoker(0, 'messages') 

// examples 

var userWithRoom = withDefaults({ 
     currentRoom : function() { 
      return { 
       number : '123' 
      } 
     } 
    }) 

var userWithMessages = withDefaults({ 
     messages : function() { 
      return [ 
       'get lunch' 
      ] 
     } 
    }) 

var userWithAll = withDefaults({ 
     currentRoom : function() { 
      return { 
       number : '123' 
      } 
     }, 
     messages : function() { 
      return [ 
       'get lunch' 
      ] 
     } 
    }) 

今すぐ上記のコードのテストをすることができます期待通り

console.log(getCurrentRoom(userWithRoom)) 
console.log(getCurrentRoom(userWithMessages))  
console.log(getCurrentRoom(userWithAll))  
console.log(getCurrentRoom(userWithNone)) 

console.log('---') 

console.log(getMessages(userWithRoom))  
console.log(getMessages(userWithMessages))  
console.log(getMessages(userWithAll))  
console.log(getMessages(userWithNone)) 

当社のソリューションが動作するかどうかを確認するためにconsole.logを使用して、出力は次のようになります。

{ number: '123' } 
{} 
{ number: '123' } 
{} 
--- 
[] 
[ 'get lunch' ] 
[ 'get lunch' ] 
[] 
関連する問題