2016-10-14 11 views
0

rethinkdbに格納されている2つのオブジェクトを比較したいとします。old_valnew_valと呼びましょう。例として、これらの値は、所有者とステータスを変更したTODOタスクを表現しましょう:2つのrethinkdbオブジェクトを比較して、その違いだけを含む新しいオブジェクトを作成するにはどうすればよいですか?

{ 
    old_val: { 
    status: 'active', 
    content: 'buy apples', 
    owner: 'jordan' 
    }, 
    new_val: { 
    status: 'done', 
    content: 'buy apples', 
    owner: 'matt' 
    } 
} 

私はold_valnew_valを比較すると、私はnew_valだけ異なるフィールドを含む新しいオブジェクトを得たいのですがold_valから。私はワイヤー上のバイトを節約するためにこれをしたいです。クライアントのレンダリングの変更を容易にすることができます。クエリの結果は次のようになります。

{ 
    old_val: { 
    content: 'buy apples', 
    owner: 'jordan', 
    status: 'active' 
    }, 
    new_val: { 
    owner: 'matt', 
    status: 'done' 
    } 
} 

どうすればよいですか?

答えて

0

この問題解決への3つの別々の部分があります。

  1. は、新しいオブジェクトを作成します
  2. を異なるフィールドのみが含まれ、一般的なフィールド間の比較比較するフィールドのリストを生成するには

(1)keys()メソッドを使用すると、フィールドのリストを生成できます。これらのフィールドをフィルタリングして、(2)old_valnew_valの両方に存在し、値が異なるフィールドのみを含めることができます。このシーケンスをconcatMap()に渡すと、[key0, value0, key1, value1]のようなキーと値のペアの配列が構築されます。最後に、r.object()関数に引数として(r.args()を使用して)適用することで、このシーケンスから新しいオブジェクトを構築できます(3)。

それはこのように一緒に来る:

r.expr({ 
    old_val: { 
    status: 'active', 
    content: 'buy apples', 
    owner: 'jordan' 
    }, 
    new_val: { 
    status: 'done', 
    content: 'buy apples', 
    owner: 'matt' 
    } 
}).do((diff_raw) => 
    r.expr({ 
    old_val: diff_raw('old_val'), 
    // build an object only containing changes between old_val and new_val: 
    new_val: r.object(r.args(
     diff_raw('new_val') 
     .keys() 
     // only include keys existing in old and new that have changed: 
     .filter((k) => 
      r.and(
      diff_raw('old_val').hasFields(k), 
      diff_raw('new_val')(k).ne(diff_raw('old_val')(k)) 
     ) 
     ) 
     // build a sequence of [ k0, v0, k1, v1, ... ]: 
     .concatMap((k) => [k, diff_raw('new_val')(k)]) 
    )) 
    }) 
) 

これが返されます:

{ 
    "new_val": { 
    "owner": "matt" , 
    "status": "done" 
    } , 
    "old_val": { 
    "content": "buy apples" , 
    "owner": "jordan" , 
    "status": "active" 
    } 
}