2016-03-29 29 views
0

özlüyorum RxJS çalışıyorum.RxJs - ayrıştırma dosyası, konulara göre grup satırları, ama ben son

Kullanım durumum, bir günlük dosyasını ve grup satırlarını konuya göre ayrıştırmaktır (yani: grubun başlangıcı dosya adıdır ve daha sonra kullanıcı, tarih/saat ve benzeri bazı satırlarım var) regExp kullanarak satırları analiz eder. Grubun başlangıcını belirleyebilirim.

Satırları birlikte gruplandırmak için ".scan" ı kullanıyorum, yeni satır grubunun başlangıcında, biriktirdiğim çizgiler üzerinde bir gözlemci oluyorum ... iyi.

Sorun, dosyanın sonu. Yeni bir grup kurdum, çizgiler biriktiriyorum ama son sıraya giremiyorum, çünkü sonuncusunda bilgi yok. Bilgileri eksiksiz (ancak)

'da olmasını beklerdim. 3 veya 5. çoklu olabilir grubunun başlayın (sözler: Ben daktilo çalışmak):

0 => 0 
1.2.3 => 1 
1.2.3 => 2 
1.2.3 => 3 
4.5 => 4 
4.5 => 5 
6 => 6 

Ben arıyorum

yayacak şekilde nasıl

import * as Rx from "rx"; 
 

 
let r = Rx.Observable 
 
     .range(0, 8) 
 
     .scan(function(acc: number[], value: number): number[]{ 
 
      if ((value % 3 === 0) || (value % 5 === 0)) { 
 
       acc.push(value); 
 
       let info = acc.join("."); 
 
       Rx.Observable 
 
        .fromArray(acc) 
 
        .subscribe((value) => { 
 
         console.log(info, "=>", value); 
 
        }); 
 
       acc = []; 
 
      } else { 
 
       acc.push(value); 
 
      } 
 
      return acc; 
 
     }, []) 
 
     .subscribe(function (x) { 
 
      // console.log(x); 
 
     });

Bu yayarlar

0 => 0 
1.2.3 => 1 
1.2.3 => 2 
1.2.3 => 3 
4.5 => 4 
4.5 => 5 
6 => 6 
7.8 => 7  last items are missing as I do not know how to detect end 
7.8 => 8   

Eşyaları gruplamak için bana yardımcı olabilir misiniz? Tarama kullanmasa bile iyi bir fikir var. peşin

cevap

0

yılında

Teşekkür Sen materialize operatörünü kullanabilirsiniz. here ve marbles belgelerine ve SO'dan bir example of use belgelerine bakın. * Olarak

ithalat: (bazı sözdizimi hataları olabilir bu yüzden daktilo hakkında hiçbir şey bilmiyorum unutmayın, denenmemiş ama umarım bunu kendiniz tamamlayabilirsiniz) Senin durumunda

, şöyle bir şey denemek istiyorum Rx "rx";

let r = Rx.Observable 
     .range(0, 8) 
     .materialize() 
     .scan(function(acc: number[], materializedNumber: Rx.Notification<number>): number[]{ 
      let rangeValue: number = materializedNumber.value; 

      if ((rangeValue % 3 === 0) || (rangeValue % 5 === 0)) { 
       acc.push(rangeValue); 
       generateNewObserverOnGroupOf(acc); 
       acc = []; 
      } else if (materializedNumber.kind === "C") { 
       generateNewObserverOnGroupOf(acc); 
       acc = []; 
      } else { 
       acc.push(rangeValue); 
      } 
      return acc; 
     }, []) 
     // .dematerialize() 
     .subscribe(function (x) { 
      // console.log(x); 
     }); 

function generateNewObserverOnGroupOf(acc: number[]) { 
    let info = acc.join("."); 
       Rx.Observable 
        .fromArray(acc) 
        .subscribe((value) => { 
         console.log(info, "=>", value); 
        }); 

fikri mesajı akımı geçen olup olmadığı kodlayan bildirimleri ile materialize ve dematerialize işleri, ', Cı-completed türlü (sırasıyla ' N', 'e' next biri error, olmasıdır 'kind özelliği için değerler. Bir next bildiriminiz varsa, bildirim değeri, bildirim nesnesinin value alanındadır. Tamamlandığında ve tamamlandığında kaynakları serbest bırakabilmesi için akışın normal davranışına dönmek üzere kaydileştirmeniz gerektiğini unutmayın.

+0

Harika, çekicilik gibi çalışın; – rlasjunies