kzen.dev
  • Întrebări
  • Tag-uri
  • Utilizatori
Notificări
Recompense
Înregistrare
După înregistrare, veți primi notificări despre răspunsurile și comentariile la întrebările DVS.
Logare
Dacă aveţi deja un cont, autentificaţi-vă pentru a verifica notificările noi.
Aici vor fi recompensele pentru întrebările, răspunsurile și comentariile adăugate sau modificate.
Mai mult
Sursă
Editează
Scott Klarenbach
Scott Klarenbach
Question

Scurt-circuit Matrice.forEach cum ar fi de asteptare rupe

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

Cum pot face acest lucru folosind noul "forEach" metoda în JavaScript? Am'am încercat revenirea lui;,return false; "" și "pauză". "rupe" de accidente și "întoarcere" nu face nimic, dar continua repetare.

1416 2010-04-14T21:57:31+00:00 29
Alexander Abakumov
Alexander Abakumov
Întrebarea editată 21 septembrie 2018 в 2:47
Programare
arrays
javascript
Această întrebare are 1 răspuns în engleză, pentru a le citi, vă rugăm să vă logați.
Solution / Answer
 bobince
bobince
14 aprilie 2010 в 10:02
2010-04-14T22:02:14+00:00
Mai mult
Sursă
Editează
#10323112

Nu's built-in capacitatea de a "sparge" în "forEach". Pentru a întrerupe executarea ar trebui să arunca o excepție de un anumit fel. de exemplu.

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 excepții sunt't teribil de frumos. Un tradițional "pentru" bucla ar putea fi mai potrivit, dacă aveți cu adevărat nevoie de a "rupe" în interiorul acestuia.

Utilizare Matrice#unele

În schimb, utilizați Matrice#unele:

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

Acest lucru funcționează pentru că "unele" returnează "adevărat" de indata ce oricare dintre callback, executată în array comanda, returnează "adevărat", scurt-circuit executarea de restul.

"unele", își inverse fiecare (care se va opri pe o return false), și "forEach" sunt toate ECMAScript de-a Cincea Ediție a metodelor care vor trebui să fie adăugate la `Matrice.prototip pe browsere de unde au're lipsește.

1941
0
 canac
canac
19 august 2015 в 4:43
2015-08-19T16:43:02+00:00
Mai mult
Sursă
Editează
#10323127

Există acum o modalitate mai bună de a face acest lucru în ECMAScript2015 (aka ES6) folosind noua pentru a buclei. De exemplu, acest cod nu imprimați elementele de matrice după numărul 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;
  }
}

Din documente:

Ambele în și pentru...de declarații repeta peste ceva. Principala diferență dintre ele este în ceea ce se repeta peste. La în declarația reiterează peste nenumărate proprietăți ale unui obiect, în original inserție ordine. La pentru...de declarația reiterează peste datele care iterable obiect definește a fi reiterat peste.

Trebuie indicelui în repetare? Puteți utiliza Matrice.intrări():

for (const [index, el] of arr.entries()) {
  if ( index === 5 ) break;
}
 hitautodestruct
hitautodestruct
Răspuns editat 15 mai 2018 в 11:00
362
0
 Valdemar_Rudolfovich
Valdemar_Rudolfovich
19 iulie 2012 в 9:18
2012-07-19T09:18:49+00:00
Mai mult
Sursă
Editează
#10323117

Puteți utiliza fiecare metoda:

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

ES6

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

pentru vechi sprijin browser-ul folosit:

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;
  };
}

mai multe detalii aici.

 Rich
Rich
Răspuns editat 10 decembrie 2018 в 8:09
191
0
Rahul Desai
Rahul Desai
6 ianuarie 2016 в 9:16
2016-01-06T21:16:12+00:00
Mai mult
Sursă
Editează
#10323132

Citez din MDN documentația deArray.prototype.forEach():

nu Există nici o modalitate de a opri sau de a sparge o forEach() bucla, altele decât de a arunca o excepție. Dacă aveți nevoie de astfel de comportament,.forEach() metoda este greșit instrument de, utilizați un simplu buclă în loc. Dacă sunteți de testare elementele de matrice pentru un predicat și au nevoie de un boolean valoarea de returnare, puteți utiliza fiecare() sau un() în loc.

Pentru cod (în cauză), după cum a sugerat @bobince, utilizare Array.prototype.some() în loc. Se potriveste foarte bine la usecase.

Matrice.prototip.unele() execută funcția de apel invers o singură dată pentru fiecare element prezent în gamă până când se găsește unul care callback returnează o sinceră valoare (o valoare care devine realitate atunci când sunt convertite la un "Boolean"). Dacă un astfel de element este găsit, pentru unele()returnează imediat adevărat. În caz contrar,un()` întoarce false. callback este apelată numai pentru indici din matrice care au atribuit valori; nu este invocat pentru indici care au fost șterse sau care nu au fost atribuite valori.

Rahul Desai
Rahul Desai
Răspuns editat 2 mai 2018 в 6:54
69
0
Weston Ganger
Weston Ganger
25 august 2015 в 8:03
2015-08-25T20:03:45+00:00
Mai mult
Sursă
Editează
#10323129

Din păcate, în acest caz, acesta va fi mult mai bine dacă tu nu't folosi "forEach". În loc să folosească un "pentru" buclă și va funcționa exact așa cum v-ați aștepta.

var array = [1, 2, 3];
for (var i = 0; i < array.length; i++) {
  if (array[i] === 1){
    break;
  }
}
Weston Ganger
Weston Ganger
Răspuns editat 7 decembrie 2017 в 9:18
66
0
 vittore
vittore
14 aprilie 2010 в 10:06
2010-04-14T22:06:18+00:00
Mai mult
Sursă
Editează
#10323114

Ia în considerare pentru a utiliza "jquery" 's fiecare metoda, deoarece permite să se întoarcă false în interiorul funcție de apel invers:

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

Lodash biblioteci oferă, de asemenea, takeWhile metoda care poate fi legat cu map/reduce/ori etc:

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');
// => []
 vittore
vittore
Răspuns editat 18 aprilie 2017 в 11:18
25
0
Oliver Moran
Oliver Moran
15 ianuarie 2017 в 8:20
2017-01-15T20:20:05+00:00
Mai mult
Sursă
Editează
#10323134

Din exemplu de cod, se pare ca `Matrice.prototip.găsi ceea ce căutați pentru: Matrice.prototip.find() și Matrice.prototip.findIndex()

[1, 2, 3].find(function(el) {
    return el === 2;
}); // returns 2
19
0
Chris West
Chris West
5 iulie 2011 в 7:32
2011-07-05T19:32:16+00:00
Mai mult
Sursă
Editează
#10323116

Dacă doriți să utilizați Dean Edward's sugestie si arunca StopIteration eroare pentru a iesi din bucla fără a fi nevoie pentru a prinde de eroare, puteți folosi următoarea funcție (inițial de aici):

// Use a closure to prevent the global namespace from be polluted.
(function() {
  // Define StopIteration as part of the global scope if it
  // isn't already defined.
  if(typeof StopIteration == "undefined") {
    StopIteration = new Error("StopIteration");
  }

  // The original version of Array.prototype.forEach.
  var oldForEach = Array.prototype.forEach;

  // If forEach actually exists, define forEach so you can
  // break out of it by throwing StopIteration.  Allow
  // other errors will be thrown as normal.
  if(oldForEach) {
    Array.prototype.forEach = function() {
      try {
        oldForEach.apply(this, [].slice.call(arguments, 0));
      }
      catch(e) {
        if(e !== StopIteration) {
          throw e;
        }
      }
    };
  }
})();

Codul de mai sus va oferi posibilitatea de a rula cod, cum ar fi următoarele, fără a fi nevoie să-ți faci propriul try-catch clauze:

// Show the contents until you get to "2".
[0,1,2,3,4].forEach(function(val) {
  if(val == 2)
    throw StopIteration;
  alert(val);
});

Un lucru important de reținut este faptul că acest lucru va actualiza numai Matrice.prototip.forEach funcție, dacă acesta există deja. Dacă nu't există deja, acesta nu va modifica-l.

14
0
 Max
Max
29 iulie 2013 в 12:34
2013-07-29T12:34:28+00:00
Mai mult
Sursă
Editează
#10323119

Răspuns scurt: utilizați pentru...rupepentru acest lucru sau să modificați codul pentru a evita ruperea de "forEach". A nu se folosi.unele (de) "sau".fiecare()să se întreacă pentru...rupe. Rescrie codul pentru a evita pentru...rupe bucla, sau de a folosi pentru...rupe. De fiecare dată când utilizați aceste metode ca pentru...rupe alternative Dumnezeu ucide pisica.

Răspuns lung:

.unele () "și".fiecare() reveni boolean valoare .unele() returnează "true" dacă există orice element pentru care au trecut funcția returnează "adevărat", fiecare se întoarce "fals" dacă nu există nici un element care a trecut funcția returnează "false". Aceasta este ceea ce că funcțiile. Utilizarea funcțiilor pentru ceea ce ei nu't să spun este mult mai rău atunci folosind tabele pentru layout în loc de CSS, pentru că-l enervează pe toată lumea care citește codul.

De asemenea, singurul mod posibil de a utiliza aceste metode pentru...rupealternativă este de a face efecte secundare (schimba unele vars în afara.unele()callback function), iar acest lucru nu este cu mult diferit de lapentru...rupe`.

Deci, folosind .unele (de) "sau".fiecare () " ca " pentru...rupe bucla alternativă e't lipsite de efecte secundare, e't mult mai curat atunci pentru...rupe`, acest lucru este frustrant, așa că nu e't mai bine.

Întotdeauna poți rescrie codul dvs., astfel încât nu va mai fi nevoie în pentru...rupe. Puteți filtra matrice folosind .filtru(), puteți împărți matrice folosind .slice() și așa mai departe, apoi utilizați .forEach () "sau".harta() pentru că o parte din matrice.

9
0
 RussellUresti
RussellUresti
14 aprilie 2010 в 10:07
2010-04-14T22:07:11+00:00
Mai mult
Sursă
Editează
#10323115

A găsit această soluție pe un alt site. Puteți încheia forEach într-un try / catch scenariu.

if(typeof StopIteration == "undefined") {
 StopIteration = new Error("StopIteration");
}

try {
  [1,2,3].forEach(function(el){
    alert(el);
    if(el === 1) throw StopIteration;
  });
} catch(error) { if(error != StopIteration) throw error; }

Mai multe detalii aici: http://dean.edwards.name/weblog/2006/07/enum/

4
0
 tennisgent
tennisgent
20 februarie 2013 в 4:54
2013-02-20T16:54:54+00:00
Mai mult
Sursă
Editează
#10323118

Acest lucru este doar ceva cu care am venit pentru a rezolva problema... m-am'm destul de sigur că rezolvă problema că originalul asker avut:

Array.prototype.each = function(callback){
    if(!callback) return false;
    for(var i=0; i<this.length; i++){
        if(callback(this[i], i) == false) break;
    }
};

Și atunci s-ar numi, prin utilizarea:

var myarray = [1,2,3];
myarray.each(function(item, index){
    // do something with the item
    // if(item != somecondition) return false; 
});

Întoarce false, în funcție de apel invers va provoca o pauză. Lasă-mă să știu dacă asta nu't lucra de fapt.

3
0
 c24w
c24w
3 decembrie 2013 в 2:26
2013-12-03T14:26:13+00:00
Mai mult
Sursă
Editează
#10323120

Un alt concept am venit cu:

function forEach(array, cb) {
  var shouldBreak;
  function _break() { shouldBreak = true; }
  for (var i = 0, bound = array.length; i < bound; ++i) {
    if (shouldBreak) { break; }
    cb(array[i], i, array, _break);
  }
}

// Usage

forEach(['a','b','c','d','e','f'], function (char, i, array, _break) {
  console.log(i, char);
  if (i === 2) { _break(); }
});
 c24w
c24w
Răspuns editat 10 ianuarie 2019 в 1:02
3
0
 3rdEden
3rdEden
4 iunie 2014 в 9:38
2014-06-04T09:38:31+00:00
Mai mult
Sursă
Editează
#10323123

Dacă tu nu't nevoie pentru a accesa matrice după repetare puteți salva prin stabilirea matrice's lungimea la 0. Dacă încă nevoie de ea după repetare ai putea clona folosind felie..

[1,3,4,5,6,7,8,244,3,5,2].forEach(function (item, index, arr) {
  if (index === 3) arr.length = 0;
});

Sau cu o clona:

var x = [1,3,4,5,6,7,8,244,3,5,2];

x.slice().forEach(function (item, index, arr) {
  if (index === 3) arr.length = 0;
});

Care este o soluție mult mai bine apoi a aruncat aleatoare erori în cod.

3
0
 jamos
jamos
19 octombrie 2017 в 9:54
2017-10-19T09:54:09+00:00
Mai mult
Sursă
Editează
#10323138

Aceasta este o buclă, dar menține obiectul de referință în buclă ca un forEach (), dar puteți ieși.

var arr = [1,2,3];
for (var i = 0, el; el = arr[i]; i++) {
    if(el === 1) break;
}
3
0
 Alex
Alex
14 decembrie 2017 в 11:58
2017-12-14T11:58:54+00:00
Mai mult
Sursă
Editează
#10323139

Așa cum am menționat înainte, puteți't rupe .forEach().

Aici's un pic mai modern mod de a face un foreach cu ES6 Iteratori. Vă permite să obțineți acces direct la "index" / "valoare" atunci când iterarea.

const array = ['one', 'two', 'three'];

for (const [index, val] of array.entries()) {
  console.log('item:', { index, val });
  if (index === 1) {
    console.log('break!');
    break;
  }
}

Ieșire:

item: { index: 0, val: 'one' }
item: { index: 1, val: 'two' }
break!

Link-uri

  • Array.prototype.entries()
  • Iteratori și generatoare
  • Destructurare assignment
3
0
public override
public override
5 ianuarie 2014 в 10:42
2014-01-05T22:42:19+00:00
Mai mult
Sursă
Editează
#10323122

Eu folosesc nullhack pentru acest scop, ea încearcă să acceseze proprietatea null, care este o eroare:

try {
  [1,2,3,4,5]
  .forEach(
    function ( val, idx, arr ) {
      if ( val == 3 ) null.NULLBREAK;
    }
  );
} catch (e) {
  // e <=> TypeError: null has no properties
}
//
1
0
Durgpal Singh
Durgpal Singh
20 iulie 2017 в 9:41
2017-07-20T09:41:23+00:00
Mai mult
Sursă
Editează
#10323135

Știu că nu-i corect mod. Nu se rupe bucla. Este un Jugad

let result = true;
[1, 2, 3].forEach(function(el) {
    if(result){
      console.log(el);
      if (el === 2){
        result = false;
      }
    }
});
1
0
Justus Romijn
Justus Romijn
24 septembrie 2015 в 12:30
2015-09-24T12:30:48+00:00
Mai mult
Sursă
Editează
#10323130

Dacă vrei să-ți păstrezi "forEach" sintaxa, aceasta este o modalitate de a păstra eficient (deși nu la fel de bun ca un regulat pentru bucla). Verificați imediat pentru o variabilă care știe că, dacă vrei să ieși din bucla.

Acest exemplu utilizează o funcție anonim pentru a crea o funcție de domeniul de aplicare în jur de "forEach" care aveți nevoie pentru a stoca făcut informații.

(function(){
    var element = document.getElementById('printed-result');
    var done = false;
    [1,2,3,4].forEach(function(item){
        if(done){ return; }
        var text = document.createTextNode(item);
        element.appendChild(text);
        if (item === 2){
          done = true;
          return;
        }
    });
})();
<div id="printed-result"></div>

Cei doi cenți ai mei.

1
0
Harry Bosh
Harry Bosh
3 octombrie 2018 в 1:05
2018-10-03T01:05:09+00:00
Mai mult
Sursă
Editează
#10323142

O altă abordare

        var wageType = types.filter(function(element){
            if(e.params.data.text == element.name){ 
                return element;
            }
        });
        console.dir(wageType);
1
0
 Yiling
Yiling
2 mai 2015 в 7:38
2015-05-02T07:38:30+00:00
Mai mult
Sursă
Editează
#10323125

Folosi `matrice.prototip.fiecare funcția, care vă oferă utilitatea de a sparge looping. Vezi de exemplu aici Javascript documentația pe Mozilla developer network

0
0
Comunități asemănătoare 1
JavaScript, România - Moldova
JavaScript, România - Moldova
288 utilizatori
Comunitatea Română JavaScript: github.com/js-ro Pentru confort, opriți notificările. Parteneri: @php_ro, @python_ro, @devops_ro, @seo_ro Offtop: @holywars_ro
Deschide telegram
Adăugati o întrebare
Categorii
Toate
Tehnologii
Cultură
Viață / Artă
Stiință
Profesii
Afaceri
Utilizatori
Toate
Nou
Populare
1
Daniel Gogov
Înregistrat 6 zile în urmă
2
工藤 芳則
Înregistrat 1 săptămână în urmă
3
Ирина Беляева
Înregistrat 2 săptămâni în urmă
4
Darya Arsenyeva
Înregistrat 2 săptămâni în urmă
5
anyta nuam-nuam (LapuSiK)
Înregistrat 2 săptămâni în urmă
DA
DE
EL
ES
FI
FR
ID
IT
JA
KO
NL
NO
PT
RO
RU
TR
ZH
© kzen.dev 2023
Sursă
stackoverflow.com
în cadrul licenței cc by-sa 3.0 cu atribuire