2017-07-18 148 views
0

我想我收到每5秒標記的陣列利用RxJS observablesjQuery $.ajaxRxJS谷歌地圖標記

從數據庫中獲取只有新"Google Map" Markers。 當數組內的數據發生變化時,即添加了新的標記,我只需要過濾掉新的標記。

var oldArray = [["ObjA",3455,643523,2],["ObjB",5346,2134,1],["ObjC",5341,7135,0]]; 
var newArray = [["ObjA",3455,643523,2],["ObjD",2384,4791,3],["ObjB",5346,2134,1],["ObjC",5341,7135,0],["ObjF",2631,7228,4]]; 

所以在這裏從newArray我需要過濾掉["ObjD",2384,4791,3]["ObjF",2631,7228,4]

我不知道它是如何完成的,能不能只利用RxJS在全部完成。

我真的很感激,如果有人能帶領我走向正確的方向!

var observable = Rx.Observable 
    .interval(5000) 
    .flatMap(function() { 
    return Rx.Observable 
     .from($.ajax({url: "https://somedomain.com/json"}).promise()) 
    }) 
    .filter(x => !!x === true) 
    .distinctUntilChanged(); 


observable.subscribe((response) => { 
     var newMarker = $.parseJSON(response.data);      
}); 
+0

你可以發佈你嘗試過的東西和你卡在哪裏的片段嗎? – paulpdaniels

+0

@paulpdaniels,謝謝你的回覆。對此,我真的非常感激。我用代碼片段更新了我的問題。我一直試圖以許多不同的方式完成這項任務,但沒有成功。這是我最後一次嘗試的代碼。請不要嚴格評判我,因爲我對RxJS非常陌生,並且盡力以合適的方式快速獲得它。 再次感謝! –

+0

因此,當你從服務器返回數據時,你被困住的部分是怎麼做的? – paulpdaniels

回答

1

有關陣列的工作,你不需要RxJS,你可以在ES6使用新的數組運算符:

onlyNewArray = 
    newArray 
     .filter(newItem => 
      !oldArray.some(oldItem => oldItem[0] === newItem[0])); 

some()將通過項目的陣列在一個接一個,如果任何滿足它將返回true的標準。在這裏,我們檢查,如果每個newArray的項目是存在於老了,如果他們不onlyNewArray


包括他們更新

這將檢查如果oldItem所有項目等於在newItem相應的項目:

onlyNewArray = 
    newArray 
     .filter(newItem => 
      !oldArray.some(oldItem => 
       oldItem.every((prop, index) => 
        prop === newItem[index]))); 

更新2

要僅檢查陣列的連續的部分,可以先切它:

onlyNewArray = 
    newArray 
     .filter(newItem => 
      !oldArray.some(oldItem => 
       oldItem 
        .slice(0,3) 
        .every((prop, index) => 
         prop === newItem[index]))); 

或者,可以提供一個索引跳過,然後使用一個簡單的if/else子句:

let dontCheck = 1; 

onlyNewArray = 
    newArray 
     .filter(newItem => 
      !oldArray.some(oldItem => 
       oldItem.every((prop, index) => { 
        if(index == dontCheck){ 
         return true; 
        } else { 
         prop === newItem[index] 
        } 
       }))); 
+0

非常感謝!這真的按預期工作。 請告訴我,是否有可能通過數組中的所有元素進行過濾?在這裏,我們首先進行篩選,但是例如,如果我需要比較數組中的所有元素還是僅通過特定元素進行篩選? 對不起,如果我問得太多。提前致謝! –

+0

非常感謝Jon! 你能不能請告知如何按特定數組元素進行過濾。 [「ObjA」,3455,643523,2] 例如,我需要按0,1,2進行過濾,但元素3會被跳過並且不會被考慮在內。謝謝! 或按0,2,3跳過1. –

+1

我已經用兩種可能性更新了我的答案。我建議閱讀Mozilla文檔中的操作符:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array –