2016-10-13 33 views
1

我不能對自己解釋這個Rxjs不同和數字陣列

const something = new Rx.BehaviorSubject([1,2,4,4]) 
.distinct() 
.do((s) => console.log(s)) 
.map(list => list.length) 
.filter(length => length >=2) 
.subscribe(total => console.log('total:', total)); 

這是我得到的輸出

[1, 2, 4, 4] 
"total:" 
4 

我感到困惑,因爲檢討不同的文檔我認爲這會爲數字工作。我的用例是一個數據表小部件向我發送事件,這個數組跟蹤他們點擊了哪一行,並且我想在發生雙擊時發現。

更新的代碼

const something = new Rx.BehaviorSubject([]); 

something.next([1]); console.log(something.getValue()); something.next(something.getValue()。concat(2)); something.next(something.getValue()。concat(3)); something.next(something.getValue()。concat(4)); something.next(something.getValue()。concat(4));

東西 .distinct() .subscribe(val => console.log('value:',val));

輸出

"value:" 
[1, 2, 3, 4, 4] 
+0

你有一個數組(不流號碼)的數據流,不同的一個陣列的是相同的數組:) –

+0

哦,我可以接受這個作爲一個答案,使感覺 – Barry

+0

@OlesSavluk我上面發佈的更新後的代碼片段呢? – Barry

回答

2

你發送,恰好是一個數組的值。你會看到不同的操作,如果你沒有

const something = new Rx.BehaviorSubject([]); 
something .distinct() .subscribe(val => console.log('value:', val)); 
something.next(1); // --> value: 1 
something.next(2); // --> value: 2 
something.next(1); // no output (because of distinct) 
something.next(3); // --> value: 3 
+0

您如何提出尋找何時發送重複值並保持已提交哪些id的知識?或者這不是我應該用rx做的事情?我寫了我想在普通的js中完成的任務,但現在只是好奇它是否可能以及如何才能做到。所以說在1,2,4,6,2發送......然後你會知道2是重複的 – Barry

+0

@Barry聽起來像你想創建一個與''distinct'''相反的操作。當然,這是可能的 - 只需從'''distinct''的代碼開始(https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/distinct.js)並在發送時反轉。具體來說,[這一行](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/distinct.js#L50)成爲'''! this._h.push(key)&& this._o.onNext(x);''(「當我看見這個值的哈希鍵時,發送它通過。」) – frankleonrose

+0

@Barry Of當然,只有當你在觀察一段時間的價值流時纔想使用Rx。您將設置訂閱和處理程序,以便您將來使用尚未見過的值進行操作。如果你現在知道你的一組值,你不需要Rx。例如,使用UnderscoreJS,'''_.groupBy(mylist,_.identity).filter(function(g){return g.length> 1;})。flatten()。uniq()''' – frankleonrose