2017-12-16 26 views
0

내가 배열을 가지고, 단순화 된 양식이 될 것이다 :자바 스크립트 | 배열에 값을 변경 간격을 만들기

let array = [ 
    {id: 1, value: 0}, 
    {id: 2, value: 0}, 
    {id: 3, value: 0} 
]; 

가 지금은 간격을 만들려면, 그 ID를 가진 개체의 값을 증가 : 매 3 둘째. 지금 내가하는 일은 array[2].value 인 개체를 대상으로하는 것입니다. 배열이 변경되지 않는 한이 작동합니다.

내가 사용하는 배열은 끊임없이 변화하고 있습니다. 즉, 요소가 비동기식으로 삭제되거나 추가된다는 의미입니다. 그런 경우 간격이 잘못된 요소를 가리키고 있습니다. 예제에서 요소 [1]을 삭제하면 간격이 정의되지 않은 요소 ([2])를 가리 킵니다.

연관 배열 (id를 인덱스로 사용)을 사용하려고했지만 Angular ngFor에서 더 이상 안정적으로 작동하지 않습니다. 동일한 이유로 인해 객체도 작동하지 않습니다.

인덱스가 변경된 경우에도 배열 요소의 속성을 변경하는 간격을 만들려면 어떻게해야합니까? 아니면 내 문제에 대한 더 나은 해결책이 있습니까?

+0

그래서 당신은 키 대신 인덱스를 대상으로해야합니까? 이 같은? https://jsfiddle.net/9jqu6dhv/ – sinisake

+0

이것은 작동합니다. 왜 그런지 설명해 주시겠습니까? 이 코드는 생성 된 새로운 배열 .filter의 값을 증가 시키지만, 어쨌든 이전 배열도 변경됩니까? : –

+0

https://stackoverflow.com/questions/24304383/javascript-return-reference-to-array-item "새 배열을 반환하지만 배열의 항목은 여전히 ​​같은 개체에 대한 참조입니다." – sinisake

답변

1

사용 find 방법 :

function updateValue() { 
    var item = array.find(item => item.id === 3) 
    if (item) item.value++ 
} 

setTimeout(updateValue, 1000) 
+0

고마워, 이것이 완벽하게 작동합니다. 마침내 더 이상이 문제에 집착하지 마라! : D –

+1

좋아요! 배열의 항목은 객체이므로 외부에서 참조 된 경우에도 여전히 배열에서 업데이트됩니다. – eosterberg

1

당신은 대신 인덱스 매번를 사용하는 객체에 대한 참조를 유지해야한다. 예를 들면 :

let array = [ 
 
    {id: 1, value: 0}, 
 
    {id: 2, value: 0}, 
 
    {id: 3, value: 0} 
 
]; 
 

 
function startIncrementing(elem) { 
 
    setInterval(() => elem.value += 5, 500); 
 
} 
 

 
// Log the array every second 
 
setInterval(() => console.log(array), 1000); 
 

 
// Start the increment interval 
 
startIncrementing(array[2]); 
 

 
// Remove an elemnt after 1 second 
 
setTimeout(() => array.splice(1, 1), 1000);

+0

감사합니다. 배열 참조에 대해 알지 못했습니다.이 내용은 js 리소스에서 자세히 설명해야합니다. –