2016-09-23 7 views
3

私は非常に動的な配列を持ち、常に新しい要素があり、他の要素は削除されています。問題は時には状況によっては配列内に永遠にとどまる要素は、私が望むものではありません。すべての要素は15秒以内に配列から削除する必要があります。そうでなければ、配列はその要素を自動的に削除する必要があります。 5秒後、私は、アレイ内の2つの以上の要素を追加していタイムアウト時に配列から要素を削除Node.js

var array = ['e1', 'e2', 'e3']; 

array[3] = 'e4'; 
array[4] = 'e5'; 

、レッツ例えば、以下のコードでは、我々は、3つの要素を持つ配列を

を持っています最初の3つの要素が12:00:00 pmに配列に挿入され、2番目の要素が12:00:05 pmに挿入されるとします。最初の3つの要素を午後12時15分に、2番目の要素を午後12時20分20秒に削除したいと考えています......その他

解決方法はありますかこの問題?

+1

コードを投稿できますか?あなたが何をしているのかわからないときに修正する方法を言うのは難しいです。 –

+0

大きすぎると複雑すぎるのでコード全体を投稿できませんが、私は "問題"の説明と簡単な例を追加しました。 –

答えて

3

通常、アイテムを配列に追加するときには、存在する位置を想定したくありません。 の代わりにarray.push('e4')を実行します。これにより、あなたの人生はより楽になり、バグが発生しにくくなります。

時間を各項目に関連付ける必要があるため、文字列の代わりにこれにオブジェクトを使用することが賢明かもしれません。

// create the array and push some objects into it 
var array = [] 
array.push({createdAt: Date.now(), value: 'asdf'}) 
array.push({createdAt: Date.now(), value: 'asdf'}) 

その後、間隔で、あなたは、各オブジェクトのcreatedAt値を確認し、配列からそれらをキックするかどうかを決定することができます。

var maxLifespan = 5000 
// check once per second 
setInterval(function checkItems(){ 
    array.forEach(function(item){ 
     if(Date.now() - maxLifespan > item.createdAt){ 
      array.shift() // remove first item 
     } 
    }) 
}, 1000) 

array.shift()あなたは常に配列の最後に新しいアイテムをプッシュすることを前提としてい使用するので、彼らは常に年代順にソートされます。

配列を時間順に並べ替える必要がない場合は、配列内の特定のインデックス(ヒント:NOT delete)で要素を削除する方法を使用する必要があります。これを達成するにはarray.spliceを使用してください。

+0

このソリューションはすばらしく見えますが、手作業でアイテムを削除する方法を教えてください。ユーザがタイムアウトの前に要素を削除することがあるためです。 –

+0

array.spliceを使用して配列から要素を削除します。私は答えを広げました。 –

+0

Hmmm、私は削除したい値がどの位置にあるのかわからないので、array.spliceを使うことはできません。たとえば、 "v1"と "v2"という2つの値がある場合、v1が位置0または1にあるかどうかわかりません。v1を含む配列の項目が不要になったことがわかります。 –

3

特定のポイントで値を削除するには、配列に値を挿入したときの参照を保存する必要があります。

var map = {}; 
 

 
map[Date.now()] = ['a', 'b']; 
 
console.log(map); 
 

 
setTimeout(function() { 
 
    map[Date.now()] = ['c', 'd']; 
 
    console.log(map); 
 
}, 5000); 
 

 
setInterval(function() { 
 
    var times = Object.keys(map); 
 
    
 
    times.forEach(function(time) { 
 
    if(Date.now() > (+time + 14000)) { 
 
     delete map[time]; 
 
    } 
 
    }); 
 
    
 
    console.log(map); 
 
}, 1000);

基本的に私はキーとしての時間を節約し、その値などの項目の配列だ:あなたはこのために、プレーンJavaScriptのオブジェクトを使用する場合があります。 (コンソール出力がどのように動作するかを見るには、上記の「Run code snippet」をクリックしてください)。

基本的に1秒ごとに実行される「cronジョブ」(シンプルsetInterval)を設定し、キーが作成された時刻が14秒未満であるかどうかを確認します(cronジョブは毎秒実行されるため15秒ではありません)。次に、そのキーをオブジェクトから削除するだけです。

+0

複数のアイテムを同時に挿入する必要がない限り、これは機能します。 –

0

次のような機能を持つ配列に要素を追加することができます:あなたは要素が何で〜15秒後に削除されていないことを確認してしまう

function insert(array, element) { 
    array.push(element); 

    setTimeout(() => { 
     const index = array.indexOf(element); 
     if (index >= 0) { 
      array.splice(index, 1); 
     } 
    }, 15000); 
} 

この方法です。明らかに、オブジェクト/配列(参照型)では100%正しく動作しますが、文字列や数値などのプリミティブを格納すると、配列にそのようなプリミティブ値が2つ以上ある場合は、値の別のコピーを削除することになります最終的には〜15秒後にすべての要素が削除されます。

関連する問題