각각 Javascript를 중지하는 방법
와 Mongoose를와 Node.js Mongoose가 된 딥 .재귀 함수와 함께 중첩된 상세 댓글에서 특정 코멘트를 찾으려고 합니다.forEach
js Node.js를 정지하는 이 있습니까?forEach
가 ★★★★★★★★★★★★★★★★★★★★★★★★★★.forEach
할 수 .break
,만.return
으로 그치지 않을 forEach
.
function recurs(comment) {
comment.comments.forEach(function(elem) {
recurs(elem);
//if(...) break;
});
}
에서는 벗어날 수 없습니다.forEach
가짜로 만들 수 있는 방법은 세 가지가 있습니다.
1. 추악한 방법: 두 번째 인수를 전달합니다.forEach
콘텍스트로 사용하고, 거기에 부울을 저장한 후,if
이건 끔찍해 보여
2. 논쟁의 여지가 있는 방법: 모든 것을 하나의 방법으로 둘러쌉니다.try-catch
차단 및 예외 발생 시 차단하고 싶을 때는 예외로 합니다.이것은 매우 나빠 보여 퍼포먼스에 영향을 줄 수 있지만 캡슐화할 수 있습니다.
3. Fun Way: 사용.
['a', 'b', 'c'].every(function(element, index) {
// Do your thing, then:
if (you_want_to_break) return false
else return true
})
대신 사용할 수 있습니다.return true
깨
Array #forEwhere를 분리하는 것은 불가능합니다.(링크된 페이지에서 Firefox에 구현되어 있는 소스 코드를 조사하여 확인할 수 있습니다.)
.for
디세이블로그:
function recurs(comment) {
for (var i = 0; i < comment.comments.length; ++i) {
var subComment = comment.comments[i];
recurs(subComment);
if (...) {
break;
}
}
}
더 와 (좀 더 똑똑해지고 싶다면)comment.comments[i]
는 항상 오브젝트입니다.
function recurs(comment) {
for (var i = 0, subComment; subComment = comment.comments[i]; ++i) {
recurs(subComment);
if (...) {
break;
}
}
}
시 에 이 것이 이 작업을 사용하는 .Array.prototype.some
★★★★★★★★★★★★★★★★★」Array.prototype.every
var ar = [1,2,3,4,5];
ar.some(function(item,index){
if(item == 3){
return true;
}
console.log("item is :"+item+" index is : "+index);
});
경우에 따라서는 아마 요건을 충족시킬 것이다.
처럼 ', 하다, 하다, 하다'는 취소할 수 .forEach
을 사용하다
ary.forEach(function loop(){
if(loop.stop){ return; }
if(condition){ loop.stop = true; }
});
물론 이것은 실제로 루프를 끊는 것이 아니라 "break" 뒤에 오는 모든 요소에 대한 코드 실행을 방해할 뿐입니다.
Array.protype을 사용하고 싶은 것 같습니다.[검색(Find)]를 선택하면 어레이에서 특정 값이 발견되면 자동으로 중단됩니다.
var inventory = [
{name: 'apples', quantity: 2},
{name: 'bananas', quantity: 0},
{name: 'cherries', quantity: 5}
];
function findCherries(fruit) {
return fruit.name === 'cherries';
}
console.log(inventory.find(findCherries));
// { name: 'cherries', quantity: 5 }
서드파티 라이브러리를 이용해도 괜찮으시다면 Lodash의 기능을 이용하실 수 있습니다.
예:
var _ = require('lodash');
_.forEach(comments, function (comment) {
do_something_with(comment);
if (...) {
return false; // Exits the loop.
}
})
var f = "how to stop Javascript forEach?".split(' ');
f.forEach(function (a,b){
console.info(b+1);
if (a == 'stop') {
console.warn("\tposition: \'stop\'["+(b+1)+"] \r\n\tall length: " + (f.length));
f.length = 0; //<--!!!
}
});
Array.forEach
않고 try...catch
또는 다음과 같은 진부한 방법Array.every
★★★★★★★★★★★★★★★★★」Array.some
이치노에 대한 은 두 .
하다 1) 옛것을 사용하다for
loop:이 높은 코드 큰에서 자주 수 있습니다.loop: " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "
var testArray = ['a', 'b', 'c'];
for (var key = 0; key < testArray.length; key++) {
var value = testArray[key];
console.log(key); // This is the key;
console.log(value); // This is the value;
}
2) 호환성에 문제가 없는 경우 새로운 ECMA6(2015 사양)를 사용합니다.2016년에도 일부 브라우저와 IDE만 이 새로운 사양을 잘 지원합니다.이 방법은 반복 가능한 개체(예: 어레이)에 대해 작동하지만 반복 불가능한 개체에서 사용하려면Object.entries
방법.이 방법은 2016년 6월 18일 현재 거의 사용할 수 없으며 Chrome에서도 이를 사용하려면 특수 플래그가 필요합니다.chrome://flags/#enable-javascript-harmony
어레이의 경우 이 모든 것이 필요한 것은 아니지만 호환성은 여전히 문제가 됩니다.
var testArray = ['a', 'b', 'c'];
for (let [key, value] of testArray.entries()) {
console.log(key); // This is the key;
console.log(value); // This is the value;
}
3) 많은 사람들이 첫 번째 선택지도 두 번째 선택지도 좋은 후보가 아니라고 동의할 것입니다.옵션 2가 새로운 표준이 될 때까지 Angular와 같은 가장 일반적인 라이브러리는JS와 jQuery는 JavaScript에서 사용할 수 있는 어떤 것보다도 뛰어난 자체 루프 메서드를 제공합니다.또, 이러한 큰 라이브러리를 사용하고 있지 않고, 경량 옵션을 요구하고 있는 유저에게는, 이러한 솔루션을 사용할 수 있어 구식 브라우저와의 호환성을 유지하면서, ECMA6와 거의 동등하게 됩니다.
다음 코드는 조건이 충족되면 foreach 루프를 차단합니다.다음은 예를 제시하겠습니다.
var array = [1,2,3,4,5];
var newArray = array.slice(0,array.length);
array.forEach(function(item,index){
//your breaking condition goes here example checking for value 2
if(item == 2){
array.length = array.indexOf(item);
}
})
array = newArray;
Array 메서드를 덮어쓰면 forEach 루프에서 분리할 수 있습니다.
(function(){
window.broken = false;
Array.prototype.forEach = function(cb, thisArg) {
var newCb = new Function("with({_break: function(){window.broken = true;}}){("+cb.replace(/break/g, "_break()")+"(arguments[0], arguments[1], arguments[2]));}");
this.some(function(item, index, array){
newCb(item, index, array);
return window.broken;
}, thisArg);
window.broken = false;
}
}())
예:
[1,2,3].forEach("function(x){\
if (x == 2) break;\
console.log(x)\
}")
유감스럽게도 이 솔루션에서는 콜백 내에서 통상적인 브레이크는 사용할 수 없습니다.비활성화된 코드를 문자열로 감싸야 하며 네이티브 함수는 직접 동작하지 않습니다(단, 이 문제를 해결할 수 있습니다).
해피브레이킹!
단순 반품을 사용하지 않는가?
function recurs(comment){
comment.comments.forEach(function(elem){
recurs(elem);
if(...) return;
});
'접속' 기능에서 복귀합니다.이렇게 써요.단, 이 예에서는 각 기능에 대해서는 중단되지 않지만 전체 기능에 대해서는 이 간단한 예에서는 동작할 수 있습니다.
jQuery가 제공하는 것은each()
메서드, 없음forEach()
넌 탈옥할 수 있어each
되돌림으로써false
.forEach()
ECMA-262 규격의 일부입니다. 제가 아는 한, 이 기준을 벗어나는 유일한 방법은 예외를 두는 것입니다.
function recurs(comment) {
try {
comment.comments.forEach(function(elem) {
recurs(elem);
if (...) throw "done";
});
} catch (e) { if (e != "done") throw e; }
}
못생겼지만 할 수 있어
언급URL : https://stackoverflow.com/questions/6260756/how-to-stop-javascript-foreach
'programing' 카테고리의 다른 글
__proto__ JavaScript의 VS. 프로토타입 (0) | 2022.12.09 |
---|---|
mysql - 테이블 간에 행을 이동합니다. (0) | 2022.12.09 |
일정 시간 후 페이지 리디렉션 PHP (0) | 2022.12.09 |
리스트에서 아이템을 랜덤으로 선택하려면 어떻게 해야 하나요? (0) | 2022.12.09 |
php 함수는 기본적으로 무엇을 반환합니까? (0) | 2022.12.09 |