미니옵빠의 code stubs

Array forEach / every / some break 사용하기 본문

Language/Javascript

Array forEach / every / some break 사용하기

미니옵빠 2017. 6. 7. 11:29

자주하는 실수 중 하나.

Array.forEach() 는 break 문을 지원하지 않는데, return false 로 break 를 기대하는 경우가 있음


이 경우 try catch 로 break 시키거나 (코드 구림)

Array.every() / Array.some() 로 대체 사용하면 됨.


continue / break 를 섞어쓰려면 Array.some() 을 사용하는 것이 좋겠음


참고

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach?v=control


There is no way to stop or break a forEach() loop other than by throwing an exception. If you need such behavior, the forEach() method is the wrong tool, use a plain loop instead. If you are testing the array elements for a predicate and need a Boolean return value, you can use every() or some() instead. If available, the new methods find() or findIndex() can be used for early termination upon true predicates as well.


각 문의 return false 동작을 확인해보자.



forEach


return true / false 둘 다 continue

forEach() 자체의 return은 undefined

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#반환값


// Use return true

[1,2,3,4,5].forEach(function(value, index){

    if (value==2) return true;

    console.log(value);

})


> 1

> 3

> 4

> 5


< undefined


// Use return false

[1,2,3,4,5].forEach(function(value, index){

    if (value==2) return false;

    console.log(value);

})


> 1

> 3

> 4

> 5


< undefined



every


return true 는 continue / return false 는 break

every() 자체의 return은 모든 callball fn 의 반환값이 true 여야 true, 아니라면 false

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/every#반환값


// Use return true

[1,2,3,4,5].every(function(value, index){

    if (value==2) return true;

    console.log(value);

})


> 1


< false


// Use return false

[1,2,3,4,5].every(function(value, index){

    if (value==2) return false;

    console.log(value);

})


> 1


< false



some 


return true 는 break / return false 는 continue

some() 자체의 return은 callball fn 에 의해 하나라도 return true 가 나오면 true, 아니라면 false. return true 하면 break 되면서 true 가 함께 반환되는데, 이 동작이 some()이라는 함수명과 잘 어울림

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/some#반환값


// Use return true

[1,2,3,4,5].some(function(value, index){

    if (value==2) return true;

    console.log(value);

})


> 1


< true


// Use return false

[1,2,3,4,5].some(function(value, index){

    if (value==2) return false;

    console.log(value);

})


> 1

> 3

> 4

> 5


< false


여담으로


jQuery.$each()


return true 는 continue / return false 는 break

http://api.jquery.com/JQuery.each/




자주 쓰는 사람이 아니라면 헷갈릴 수 밖에 없을 듯 -_-