2015-12-17 38 views
12

Tôi có một mảng mà tôi muốn lọc .. âm thanh đơn giản tôi biết. Nhưng khi tôi làm, tôi vẫn nhận được toàn bộ mảng ...Làm thế nào để lọc RXJS ArrayObservable

constructor(http:Http) { 
    this._val = Math.random(); 
    let s = http.get('https://secure.digitalsignage.com/Digg'); 
    s.map(s => { 
     let news = JSON.parse(s._body); 
     return Rx.Observable.fromArray(news); 
    }).filter(function(data) { 
     console.log('all array ' + data); 
     return true; 
    }).subscribe(function (v) { 
     console.log(v); 
    }); 
} 

như vậy trong console.log ('tất cả các mảng' + dữ liệu); Tôi nhận được toàn bộ mảng thay vì một dòng của các thành viên mảng cá nhân, tại sao?

đây là debug snap:

enter image description here

Tôi biết tôi không điên vì điều này làm việc như mong đợi:

Rx.Observable.fromArray([1, 2, 3, 4, 5]).filter(function (v) { 
     if (v < 3) 
      return true 
     return false; 
    }).subscribe(function (v) { 
     console.log(v); 
    }) 

những gì mang lại?

tx để đọc,

Sean.

Trả lời

13

Bạn cần sử dụng concatMap/flatMap hoặc bất kỳ nhà điều hành nào khác làm phẳng chuỗi trình tự quan sát được.

Hiện tại, .filter nhận được một quan sát chứ không phải là các phần tử riêng lẻ của mảng (tất cả những gì bạn đang làm là biến mảng đó thành một mảng quan sát được. Ví dụ thứ hai của bạn hoạt động khi bạn đang áp dụng bộ lọc cho).

Hãy thử điều này:

constructor(http:Http) { 
    this._val = Math.random(); 
    let s = http.get('https://secure.digitalsignage.com/Digg'); 
    s.flatMap(s => { 
    let news = JSON.parse(s._body); 
    return Rx.Observable.fromArray(news); 
    }).filter(function(data) { 
    console.log('all array ' + data); 
    return true; 
    }).subscribe(function (v) { 
    console.log(v); 
    }); 
} 

Bạn cần phải làm điều này, như bạn sẽ khác (sử dụng #map) có thể quan sát được các quan sát (bạn quay trở lại một thể quan sát được bên trong quan sát được) nhưng muốn làm việc trên thực tế các giá trị chứa trong tin tức (không phải trên các quan sát có chứa chúng). Nó giống như sự khác biệt giữa việc ghép nối một mảng và chỉ thêm nó như là một phần tử.

Một cách hợp lệ để làm điều này sẽ được sử dụng bản đồ như bạn đã làm trước đây nhưng việc sáp nhập các quan sát phát ra (flatMap/concatMap chỉ bản đồ & hợp nhất trong một đi)

constructor(http:Http) { 
    this._val = Math.random(); 
    let s = http.get('https://secure.digitalsignage.com/Digg'); 
    s.map(s => { 
    let news = JSON.parse(s._body); 
    return Rx.Observable.fromArray(news); 
    }).mergeAll() // here you flatten the observable - i.e. you emit just the values contained in incoming observables and lose the observables themselves 
    .filter(function(data) { 
    console.log('all array ' + data); 
    return true; 
    }).subscribe(function (v) { 
    console.log(v); 
    }); 
} 

Nếu bạn không hiểu bất kỳ điều này không phải lo lắng, có people người có thể giải thích nó tốt hơn tôi :)

+0

trước hết cảm ơn ... đã làm điều đó, nhưng hãy để tôi hỏi bạn, tại sao tôi cần sử dụng flatMap, tôi chỉ trả lại một Rx.Observable.fromArray quan sát duy nhất (tin tức) không MANY, vậy tại sao chúng ta cần phải flay (tham gia) một quan sát duy nhất? TX !!!!!!!!!!! – born2net

+0

được chỉnh sửa để trả lời câu hỏi của bạn. –

Các vấn đề liên quan