2011-08-05 4 views
22
var people = ['alex','jason','matt']; 

people.forEach(function(p){ 
    if(p.length > 4){ 
     //REMOVE THIS PERSON or pop it out of the list or whatever 
    } 
}); 

console.log(people) //should return ['alex','matt'] 

forEach 루프를 사용하여 목록에서 요소를 제거하고 싶습니다.forEach를 사용하여 목록에서 요소를 제거하려면 어떻게합니까?

+1

당신이 위에 당신 루프로 목록을 수정하는 거 야 생각하지 않는다. –

+2

무엇을 시도 했습니까? SO는 (본질적으로) 문제에 대한 것입니다. 그것은 교실이 아닙니다. –

+2

두 번째 Rafe 및 Tomalak 님의 의견입니다. Rafe가 말한 것을 확장하려면 각 루프마다 요소를 제거하는 것이 일반적인 관례는 아니지만 (JavaScript에서 처리하는 방법을 잘 모르겠지만 어쩌면 작동 할 수도 있음) 표준 인덱스 기반 for 루프를 사용하는 것이 좋습니다 (거의 확실하게). 인덱스 변수를 조정할 필요없이 요소를 제거 할 수 있도록 마지막 요소에서 거꾸로 반복하는 것이 좋습니다. Array의 메소드에 대한 자세한 내용은 [MDN Array doco] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array)를 참조하십시오. – nnnnnn

답변

22

은 반복 할 배열을 수정하면 안됩니다. 그래도 새로운 것을 생성 할 수 있습니다.

+0

+1 또는 제거 할 인덱스를 저장하고 나중에 제거하십시오. –

+0

+1이지만 비교는'<='이어야합니다. –

+0

@ 한스 엥겔 : 완료! – Mrchief

48

올바른 작업에 적합한 도구를 사용하십시오. 이 경우 :

for (var i = 0; i < data.length; i++) { 
    if (data[i].value === 5) { 
     data.splice(i--, 1); 
    } 
} 

또는 @nnnnnn가 제안했다, 뒤쪽 루프 그러나

for (var i = data.length-1; i >= 0; i--) { 
    if (data[i].value === 5) { 
     data.splice(i, 1); 
    } 
} 

, 당신은 Array.prototype.filter() 사용을 고려해야합니다 :

data.filter(function (e) { 
    return e.value !== 5; 
}); 

또는 유틸리티 함수 라이브러리 등을 배열에서 요소를 제거하는 기능을 제공하는 lodash 또는 underscore :

_.remove(data, function (e) { 
    return e.value === 5; 
}); 

후자의 두 가지 이점은 코드가 읽기 쉽다는 것입니다. ES5 인덱스와 함께 사용 할 수 있기 때문에

+3

변화하는 인디 케이션의 문제를 고려한 깔끔한 해결책입니다! –

+3

'.filter'는 정말 멋지게 보입니다. –

1

를 ForEach는 :

data.forEach(function (element, index) { 
    if (element % 2 == 0) { 
    data.splice(index, 1); 
    } 
}); 
+1

이 코드 스 니펫 *은 실제로 작동하지 않습니다 * - 데이터가'[1,28,35,444,555,666,333,424,313,30348446412112148896108,1224,777] '이면 그것을 [1, 35, 555, 333, 313, 303, 464, 121, 14, 96, 1224, 777] –

관련 문제