Underscore [11] : 使用 difference 情境

摘要:Underscore 使用 difference 情境

今天來介紹 Underscore 的 difference 語法 ,  其語法如下 : 

 

_.difference([1, 2, 3, 4, 5], [5, 2, 10]);

 

結果 : 

=> [1, 3, 4]

 

以上面的範例來說 , 其結果會返回 A 陣列中不存在於 B 陣列元素的集合 

 

這方法其實相當好用 , 可是它只適用於基本資料型態 , 

 

若今天我們要應付比較複雜的物件呢 ? 

 

我們新增了兩組集合 , 兩個集合不同的地方在於第一個集合 ( fundGroup1 )  多了一個元素  基金2 

 

 

當我使用 difference 語法來應付這種結構呢 , 如下圖 : 

 

其顯示的結果不是我們要的 , 這就是我前面所說它只能應付基本型態 , 

 

由於 difference 內部的實做是使用 _contains , 而 _contains 的實做

 

是使用了 indexOf 來做搜尋的動作 , 因此才無法達到比對物件的效果 , 

 

那我們來改用另外一種方式吧 , 

 

我們使用 map 語法取得具有唯一性的 FUND_CODE   , 如下 : 

 

var t1 = _.map(fundGroup1,function(item){ return item.FUND_CODE})


var t2 = _.map(fundGroup2,function(item){ return item.FUND_CODE})

 

其結果如下圖 :

這樣我們就可以繼續使用 difference 來幫我們嚕 , 如下圖 :  

 

我們得到正確的結果嚕 ~

 

 

接下來藉著 CODE3 回頭去抓 fundGroup 裡面的 CODE3 基金物件 , 

 

  1. 先宣告一個 resultGroup 變數來儲存結果  
  2. 迴圈 diff 陣列取出每一個基金 FUND_CODE 
  3. 使用 _.find 比對 fundsGroup1  每個物件的 FUND_CODE 
  4. 存入 resultGroup

 

 

上述的迂迴的方式的確很麻煩 ,   所以你也可以參考下列的方式 ..

 

_.filter(fundGroup1, function(obj){ return !_.findWhere(fundGroup2, obj); });

 

其結果如下圖 , 一樣的結果 , 只是在這裡需要使用到 findWhere 語法 , 

 

有興趣的人可以參考下列的文章 : 

using underscore's “difference” method on objects

 

2014 / 10 / 31 修正