2017-07-18 227 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 –