2016-09-23 4 views
3

매우 동적 인 배열이 있으며 항상 새로운 요소가 있고 다른 요소는 제거됩니다 .. 문제는 때로는 상황에 따라 배열에 영원히 머무르기위한 요소들, 그리고 그것은 내가 원하는 것이 아닙니다. 모든 요소는 15 초 이내에 배열에서 제거되어야합니다. 그렇지 않으면 배열은 해당 요소를 자동으로 제거해야합니다.시간 초과시 배열에서 요소 제거 Node.js

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

내가 배열에 2 개 이상의 요소를 추가하고 오초 후 :

는 예를 들어, 아래 코드에서, 우리는 세 가지 요소를 가진 배열이 이제

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

,하자를의 처음 세 요소는 12:00:00 pm에 배열에 삽입되고 두 번째 요소는 12:00:05 pm에 삽입됩니다. 첫 번째 3 요소를 오후 12시 15 분에 제거하고 두 번째 요소를 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

흠, 나는 제거하고 싶은 값의 위치를 ​​모르기 때문에 array.splice를 사용할 수 없습니다. 예를 들어, "v1"과 "v2"라는 두 개의 값이있는 경우 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);

는 기본적으로 나는 열쇠로 시간을 절약하고 값으로 항목의 배열하고있다. (콘솔 출력이 어떻게 동작하는지 보려면 위의 "Run code snippet"을 클릭하십시오).

기본적으로 매 초마다 실행되는 "cron job"(간단한 setInterval)을 설정하고 키 생성 시간이 14 초 미만인지 확인합니다 (cron 작업이 1 초마다 실행되기 때문에 15 초가 아님). 그런 다음 객체에서 해당 키를 삭제합니다.

+0

동시에 여러 항목을 삽입 할 필요가없는 한 작동합니다. –

0

이 같은 기능을 배열에 요소를 추가 할 수 있습니다 :

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

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

이 방법은 요소가 ~ 15초 상관없이 후 제거되지되어 있는지 확인합니다. 분명히 객체/배열 (참조 유형)에서는 100 % 올바르게 작동하지만 문자열이나 숫자와 같은 프리미티브를 저장하면 배열에 원시 값이 1 개 이상 있으면 다른 값 사본을 제거하게 될 수도 있습니다 , 결국 ~ 15 초 후에 모든 요소가 제거됩니다.

관련 문제