[javascript] 호출 회로와 같은 단락 회로

[1,2,3].forEach(function(el) {
    if(el === 1) break;
});

forEachJavaScript 에서 새로운 방법을 사용하여이 작업을 수행하려면 어떻게해야 합니까? 나는 시도했다 return;, return false;하고 break. break충돌하고 return아무것도 반복하지 않습니다.



답변

어떤이 내장되지-에서의 능력 break에서 forEach. 실행을 중단하려면 일종의 예외를 발생시켜야합니다. 예.

var BreakException = {};

try {
  [1, 2, 3].forEach(function(el) {
    console.log(el);
    if (el === 2) throw BreakException;
  });
} catch (e) {
  if (e !== BreakException) throw e;
}

JavaScript 예외는 그리 예쁘지 않습니다. 내부에 for정말로 필요한 경우 전통적인 루프가 더 적합 할 수 있습니다 break.

사용하다 Array#some

대신 다음을 사용하십시오 Array#some.

[1, 2, 3].some(function(el) {
  console.log(el);
  return el === 2;
});

이것은 배열 순서로 실행 된 콜백이 있으면 즉시 some반환 하고 나머지는 실행을 단락 시키므로 작동 합니다 .truetrue

some, 그 반대 every(에서 멈춤 return false) 및 누락 된 브라우저에 forEach추가해야하는 모든 ECMAScript Fifth Edition 메소드입니다 Array.prototype.


답변

새로운 for of 루프를 사용하여 ECMAScript 2015 (일명 ES6)에서이 작업을 수행하는 더 좋은 방법이 있습니다. 예를 들어이 코드는 숫자 5 뒤에 배열 요소를 인쇄하지 않습니다.

let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
for (let el of arr) {
  console.log(el);
  if (el === 5) {
    break;
  }
}

문서에서 :

for … infor … of 문 모두 무언가를 반복합니다. 그들 사이의 주요 차이점은 그들이 반복하는 것입니다. 을 위해 더 … 문은 원래 삽입 순서로 객체의 열거 속성을 반복 처리. 는 의를 위해 … 문이 데이터를 반복 처리 반복 가능한 객체를 정의는 이상 반복 할 것이다.

반복에 인덱스가 필요하십니까? 당신은 사용할 수 있습니다 Array.entries():

for (const [index, el] of arr.entries()) {
  if ( index === 5 ) break;
}


답변

모든 방법을 사용할 수 있습니다 :

[1,2,3].every(function(el) {
    return !(el === 1);
});

ES6

[1,2,3].every( el => el !== 1 )

오래된 브라우저 지원을 위해 :

if (!Array.prototype.every)
{
  Array.prototype.every = function(fun /*, thisp*/)
  {
    var len = this.length;
    if (typeof fun != "function")
      throw new TypeError();

    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this &&
          !fun.call(thisp, this[i], i, this))
        return false;
    }

    return true;
  };
}

자세한 내용은 여기를 참조 하십시오 .


답변

MDN 문서Array.prototype.forEach() 에서 인용 :

없다 중지 또는 중단 할 수있는 방법forEach() 예외를 던지는 이외의 루프. 이러한 동작이 필요한 경우 .forEach()방법이 잘못된 도구 이므로 대신 일반 루프를 사용하십시오. 술어에 대해 배열 요소를 테스트하고 부울 리턴 값이 필요한 경우 every()또는 some()대신 사용할 수 있습니다 .

@bobince가 제안한대로 코드 (질문에)를 Array.prototype.some()대신 사용하십시오. 사용 사례에 매우 적합합니다.

Array.prototype.some()콜백이 진솔한 값 (a로 변환 될 때 참이되는 값)을 반환 할 때까지 배열에있는 각 요소에 대해 콜백 함수를 한 번 실행합니다 Boolean. 그러한 요소가 발견되면 some()즉시 true를 리턴합니다. 그렇지 않으면 some()false를 반환합니다. 콜백은 값이 할당 된 배열의 인덱스에 대해서만 호출됩니다. 삭제되었거나 값이 할당되지 않은 인덱스에 대해서는 호출되지 않습니다.


답변

불행히도이 경우를 사용하지 않으면 훨씬 좋습니다 forEach. 대신 일반 for루프를 사용하면 예상대로 정확하게 작동합니다.

var array = [1, 2, 3];
for (var i = 0; i < array.length; i++) {
  if (array[i] === 1){
    break;
  }
}


답변

콜백 함수 내에서 false를 반환 할 수 있으므로 jqueryeach메소드 를 사용하는 것이 좋습니다 .

$.each(function(e, i) {
   if (i % 2) return false;
   console.log(e)
})

Lodash 라이브러리는 또한 takeWhilemap / reduce / fold 등과 연결될 수있는 방법을 제공합니다 :

var users = [
  { 'user': 'barney',  'active': false },
  { 'user': 'fred',    'active': false },
  { 'user': 'pebbles', 'active': true }
];

_.takeWhile(users, function(o) { return !o.active; });
// => objects for ['barney', 'fred']

// The `_.matches` iteratee shorthand.
_.takeWhile(users, { 'user': 'barney', 'active': false });
// => objects for ['barney']

// The `_.matchesProperty` iteratee shorthand.
_.takeWhile(users, ['active', false]);
// => objects for ['barney', 'fred']

// The `_.property` iteratee shorthand.
_.takeWhile(users, 'active');
// => []


답변

코드 예제에서 원하는 Array.prototype.find것은 Array.prototype.find ()Array.prototype.findIndex ()입니다.

[1, 2, 3].find(function(el) {
    return el === 2;
}); // returns 2