2017-07-18 16 views
0

私はマーカー5秒ごとの配列を受けていますRxJS observablesjQuery $.ajaxRxJS Googleマップのマーカー

を利用することにより、データベースからのみ新しい"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から私はそれを行うことができ、それが唯一のRxJSを利用することによって全く行うことができますか見当もつかない["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

必要はありません、あなたはES6で新しい配列演算子を使用することができます。

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

some()を1により、アレイ1内の項目を通過している場合しますいずれも真実を返す基準を満たしています。ここでは、oldItemのすべての項目がある場合、これはチェックします

更新newArrayの各項目は、古い中に存在しているかどうかを確認し、それらがある場合は、onlyNewArray


でそれらを含みません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

私は2つの可能性で私の答えを更新しました。私はMozillaのドキュメントのオペレータを読むことをお勧めします:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array –

関連する問題