2016-08-01 2 views
0

배열에서 10보다 큰 숫자 만 필터링하고 부작용없이 원래 변수를 변경하고 싶습니다. 부작용없이 변수 값 필터링 및 변경

let numbers = [15, 5, 2, 1, 59, 29]; 
numbers = numbers.filter((number) => { 
    if (number > 10) return number; 
}); 

가 작동하지만,이 오른쪽, 부작용을 일으키는 :

내가 뭘하는지? 부작용없이 그렇게 할 수 있습니까? 여전히 동일한 variabla 이름을 사용합니까?

감사합니다.

+0

당신이 말하는 부작용을 설명해주십시오. –

+0

변경하려면 변이가 필요하므로 부작용없이 변수를 변경할 수 없습니다. – Bergi

+0

원래 값 * (배열)을 변형시키지 않으려면 코드에서 이미 수행합니다. 변수를 로컬로 유지하는 한 변수를 사용하여 원하는대로 할 수 있습니다. – Bergi

답변

1

그래서 ... 원래 배열 numbers을 필터링 된 정보가 포함 된 새 배열로 바꿉니다. 초기 배열을 변경하려면 더 많은 코드가 필요합니다. 훨씬 더 많은 코드가 필요한 이유는 배열을 반복하면서 배열의 길이를 수정하는 것입니다. 이는 나쁜 습관입니다.

이렇게하려면 배열을 한 번 반복하면 값이 10보다 큰 모든 인덱스를 찾을 수 있습니다. 그런 다음 모든 인덱스를 얻은 후에 루프를 반복하여 해당 인덱스의 섹션을 분리 할 수 ​​있습니다. 정렬.

다음 코드는 사용자가 수행 할 수있는 방법입니다. 가장 효율적인 방법에 대한 확신은 없지만 방법 일뿐입니다.

let numbers = [15, 5, 2, 1, 59, 29]; 
let badIndices = []; 
numbers.forEach((val, idx) => { 
    if(val > 10) badIndices.push(idx); 
}); 
badIndices = badIndices.reverse(); 
badIndices.forEach(i => numbers.splice(i, 1)); 

당신은 그렇지 않으면 꺼집니다 이후의 인덱스 오프셋 (offset), 접합 전에 인덱스의 순서를 반대로하는 것이 좋습니다. 다시 말하면, 끝에서부터 앞쪽으로 이어 붙기를 원할 것입니다. 그렇지 않으면 앞에서 제거하면 후속 색인이 변경되어 기능이 유효하지 않게됩니다.