2017-12-07 6 views
0

healthkitから、私はいくつかのデータ、例えばステップデータを受け取ります。ダブルループを避けるには?

私はこのデータを自分のサーバーに保存します。イルは、件のデータの配列をしている:

1.-たstartDate、endDateに、値

2.-たstartDate、endDateに、値

など

それは私の中での値の非常に多くのことができますサーバ。

次に、私はHealthkitの値を取得します。私にはたくさんの価値があります。サーバー内の値と新しい値。

サーバーに新しい値のみをアップロードしたいとします。

私はそう:

for each value in my server { 
    for each value in healthkit{ 
     if(startDate, endDate and value are not equal to the value in the server){ 
      then save the value in the server 
     } 
    } 
} 

ALGOは動作しますが、それは非常に非常に遅いです。私は2つのシステムで多くの価値を持つことができます。それらのほとんどは2つの場所で同じです。

あなたは良い方法をお考えですか?

healthKitにフラグを保存できません。

私は角4とタイプスクリプトでイオンを使用しています。

答えて

0

私は問題を理解するためにもう少しコンテキストが必要だと思います。 「新しい」値によって、あなたは変更されたエントリーを含んでいますか、あるいは単に追加された新しいエントリーですか?

新しい値が必要なだけで、クライアント側の配列の末尾に追加されている場合は、配列の末尾から追加できます。

let new_count = healthkit.length - myserver.length, // number of new entries 
index_start = healthkit.length - new_count, // index in healthkit array where new entries start 
new_values = healthkit.slice(index_start); // new array containing only new entries 

addNewValues(new_values); 

新しい値が別の配列にあり、それらをサーバーに更新できます。

の場合、変更された値を更新する必要がある場合は、両方のアレイを一度に(同時に)繰り返すことができます。私は、エントリが両方の配列の同じインデックスにあると仮定しようとしています。私はまた、あなたが比較したい唯一の "値"キーであると仮定しています。次の操作を実行して、変更された値を見つけることができます。

let modified_values = []; 
myserver.forEach(function(entry, i) { // iterate over server array 
    let healthkit_entry = healthkit[i]; // get healthkit entry with same index 
    if(entry.value !== healthkit_entry.value) { // see if value has changed 
     modified_values.push(healthkit_entry); // if changed, add to modified array 
    } 
}); 

updateModifiedValues(modified_values); 

今modified_valuesアレイはhealthkit配列から修飾されたエントリのすべてを有しています。

+0

感謝。問題はサーバーでは、Healthkitから来ていない別のアプリケーションの値を持つことができることです。次に、両方のアレイに同じ数のエントリを持っていません – anubis

+0

サーバからどのエントリがヘルスキットエントリであるかを判断できますか?そうであれば、それらを別の配列に入れることができます。次に、それらを並べ替えることで、必要に応じて、エントリをhealthkit配列と同じインデックスにすることができます。私は、データを何とか再構成することが、不必要なループを回避する唯一の方法だと思います。 2つの配列の関係を記述できますか? – mickmister

0

この回答は、サーバー上のデータとhealthKitのデータが同じ方法でソートされていること、または他のものに影響することなくソートできることを前提としています。

たとえば、サーバー上のデータとHealthKitのデータをStartDateでソートし、EndDateでタイを区切り、タイで値を分割することができます。

これで、マージする2つのソート済み配列があります。アイデアは、マージソートのマージ機能を使用することです。explained here.

すべてのデータを含む配列が、サーバーに保存することができます。

編集:あなたの答えのための

void mergeArrays(int arr1[], int arr2[], int n1, 
          int n2, int arr3[]) 
{ 
    int i = 0, j = 0, k = 0; 

    // Traverse both array 
    while (i<n1 && j <n2) 
    { 
     // Check if current element of first 
     // array is smaller than current element 
     // of second array. If yes, store first 
     // array element and increment first array 
     // index. Otherwise do same with second array 
     if (arr1[i] < arr2[j]) 
      arr3[k++] = arr1[i++]; 
     else if (arr2[j] < arr1[i]) 
      j++; 
     else 
      j++,i++; 
    } 

    // Store remaining elements of first array (healthKit Array) 
    while (i < n1) 
     arr3[k++] = arr1[i++]; 
} 
+0

ありがとうございます、私たちは解決策に近いと思います。しかし、例えば次のような場合:配列a = {a、b、c、e}、配列b = {a、b、c、d} }。 aはサーバからの配列、bはhealthkitからの配列です。サーバーに存在しない人の値を送信したいだけなので{c}を持っているはずです – anubis

+0

私はサーバーを扱うのに慣れていませんが、追加するのではなくすべての配列を変更することはできませんか? –

+0

とにかくそれを行うことができます、病気の詳細を編集してください。 –

関連する問題