කෙටි පරිපථ Array.for සෑම ඇමතුම් විවේකයක්ම වගේ


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

forEachජාවාස්ක්‍රිප්ට් හි නව ක්‍රමය භාවිතා කර මෙය කරන්නේ කෙසේද? මම උත්සාහ කළා return;, return false;සහ break. breakබිඳවැටීම සහ නැවත නැවත returnකිරීම හැර වෙන කිසිවක් නොකරයි.


8
returnඇත්ත වශයෙන්ම පුනරාවර්තනය දිගටම කරගෙන යන අතරම, එය බ්ලොක් එකෙන් පසුව එන ඕනෑම කේතයක් මඟ හරිනු ඇති බව සඳහන් කිරීම වටී . උදාහරණයක් සඳහා මෙම කේතය ගන්න: [1,2,3].forEach(function(el) { if(el === 2) { console.log(`Match on 2!`); return; } console.log(el); });.මේ console.log(el);2 ගැලපෙන විට මඟහැරේ වනු ඇත.
ෂේන්

7
ටීඑල්; ඩීආර්: මම ඔබගෙන් බොහෝ කාලයක් ඉතිරි කරමි. මම පහුගිය කාලේ ගොඩක් ජේ.එස්. : පිළිතුර (28 න් ...), ඔබට මීට සොයන බව මෙම එක් stackoverflow.com/a/32101207/1599699
ඇන්ඩෲ

Answers:


2177

කිසිදු බිල්ට් හැකියාව තියෙනවා 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;
}

ජාවාස්ක්‍රිප්ට් ව්‍යතිරේකයන් ඉතා ලස්සන නැත. සාම්ප්‍රදායික forපුඩුවක් ඔබට සැබවින්ම අවශ්‍ය නම් එය වඩාත් සුදුසු breakවේ.

භාවිත Array#some

ඒ වෙනුවට, භාවිතා කරන්න Array#some:

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

මෙම නිසා ය someප්රතිලාභ trueරැසක් සඳහා, නැවත දී ඝාතනය කරන ලද callbacks ඕනෑම ඉක්මනින්, true, ඉතිරි ඝාතනය කෙටි සර්කිට්.

some, එහි ප්‍රතිලෝම every(එය a මත නතර වනු ඇත return false), සහ forEachඒවා සියල්ලම ECMAScript පස්වන සංස්කරණ ක්‍රම වන Array.prototypeඅතර ඒවා අතුරුදහන් වූ බ්‍රව්සර් මත එකතු කළ යුතුය .


126
මෙය සාමාන්‍ය ලූපයක් සඳහා භාවිතා කිරීමට වඩා කියවිය හැකි හෝ වඩා ක්‍රියාකාරී නොවේ. පිළිතුර විය යුත්තේ “මේ අවස්ථාවේ සෑම එකක් සඳහාම භාවිතා නොකරන්න” -1
බීටී

37
මම හිතන්නේ "සමහරක්" මෙහි හොඳයි, ඇයි මුල් පිටවීමේ ප්‍රශස්තිකරණය භාවිතා නොකරන්නේ-
chrismarx

28
Minding ස්තුතියි someසහ every, මෙම පිළිතුරු ටොප් මත විය යුතුය. කියවිය නොහැකි යැයි මිනිසුන් සිතන්නේ මන්දැයි තේරුම් ගත නොහැක. ඒක නියමයි!
කාල් ඇඩ්ලර්

9
භාවිතය Array#someඇත්තෙන්ම හොඳයි. පළමුවෙන්ම එය ie9 සහ ෆයර්ෆොක්ස් 1.5 ඇතුළු බොහෝ බ්‍රව්සර් සමඟ අනුකූල වේ. මගේ උදාහරණ භාවිත අවස්ථාව වනුයේ දර්ශකය පරාසයක [a, b] පරාසයක් තුළ සොයා ගැනීමයි, එහිදී සංඛ්‍යාවක් පහළ මායිම සහ ඉහළ මායිම් යුගල අතර වේ, පරීක්ෂා කර සොයාගත් විට සත්‍යය නැවත ලබා දෙන්න. for..ofනව බ්‍රව්සර් සඳහා පමණක් වුවද ඊළඟ හොඳම විසඳුම වනු ඇත.
සොජිමාක්සි

107
ව්‍යතිරේක හැසිරවීම කිසි විටෙකත් පාලන ප්‍රවාහයක් ලෙස භාවිතා නොකළ යුතුය. කාලය.
අවංක

505

ECMAScript2015 (aka ES6) හි නව for for loop භාවිතා කරමින් මෙය කිරීමට ඊටත් වඩා හොඳ ක්‍රමයක් දැන් තිබේ . උදාහරණයක් ලෙස, මෙම කේතය අංක 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;
  }
}

ලියකියවිලි වලින්:

දෙකම සඳහා ... දී සහ සඳහා ... ක දේවල් ගැන ප්රකාශ අවංකව. ඔවුන් අතර ඇති ප්‍රධාන වෙනස වන්නේ ඔවුන් නැවත කියන දෙයයි. මෙම සඳහා ... දී ප්රකාශයක් මුල් ඇතුලත් කිරීම් සඳහා, කට වස්තුවක ගණ්ය ගුණ දයානන්ද්. මෙම සඳහා ... ක ප්රකාශය iterable වස්තුව නිර්වචනය කට ශාඛාවයි කිරීමට දත්ත කට දයානන්ද්.

පුනරාවර්තනයේ දර්ශකය අවශ්‍යද? ඔබට භාවිතා කළ හැකිය Array.entries():

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

4
upsuperhero ඔබට මූලද්‍රව්‍යයේ දර්ශකය සඳහා ... සඳහා පුඩුවක් ලබා ගත හැකිය, ඔබට භාවිතා කළ entriesයුතුය. for (const [index, element] someArray.entries ()) {// ...}
blackxored

අරා සමඟ ... භාවිතා නොකිරීමට නිර්දේශ කර නැද්ද?
schehata

5
@emostafa ඔබ සඳහා පමණ නිවැරදි දී වළළු පෙලගැස්මක් සඳහා නිර්දේශ කර නැත, නමුත් මෙම ඇත්තටම සඳහා භාවිතා ප්රවේශයක් වන පුඩුවක්.
canac

මෙය "for for" වන අතර මෙය සැබවින්ම පිරිසිදු විසඳුමකි ... නමුත් මෙයද ES6 ලක්ෂණයකි, එබැවින් මෙය ක්‍රියාත්මක වන්නේ ඔබේ පරිසරය ES6 සඳහා සකසා ඇත්නම් පමණි.
චැඩ්

මම මෙම විසඳුම බොහෝ සෙයින් භාවිතා කරන බව මට පෙනේ, මම එය වස්තු සඳහාද භාවිතා කරමි. වස්තූන් සමඟ, ඔබට අරාව සඳහා Object.entries(myObject)භාවිතා කරන ආකාරයටම එය කළ හැකිය for..in. JS පෙලගැස්මක් ඒ අවටනම් යටතේ මූලික වශයෙන් විරුද්ධ බව සටහන: blog.niftysnippets.org/2011/01/myth-of-arrays.html
ඇන්ඩෲ

208

ඔබට සෑම ක්රමයක්ම භාවිතා කළ හැකිය :

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

වැඩි විස්තර මෙතැනින් .


10
දැන් ES6 හි ලස්සන හා පිරිසිදුයි -[1,2,3].every( el => el !== 1 )
මෙටේම්

1
Ald වොල්ඩෙමර්, නමුත් ඇමතුම් අනුපිළිවෙලින් කරන බවට every සහතිකයක් තිබේද?
පැසීරියර්

4
AcPacerier, ඔබට දර්ශකය k0 සිට ආරම්භ වන අතර එය 1 කින් වැඩි කරන ES6 පිරිවිතරයේ ඇල්ගොරිතම ඔබට දැකිය හැකිය : http://www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.every
XP1

@ එක්ස්පී 1, සියලු ක්‍රියාත්මක කරන්නන් එය එසේ කළ යුතුද?
පැසීරියර්

1
Ac පැසීරියර්, ඔව්, බොහෝ ජනප්‍රිය ක්‍රියාත්මක කිරීම් නිසියාකාරව ක්‍රියාත්මක වේ. කාවැද්දූ ක්‍රියාත්මක කිරීම් ගැන ඔබ සැලකිලිමත් වන්නේ නම්, සාමාන්‍යයෙන් එය ඔපෙරා හෝ වෙබ්කිට් ය. අරාවෙහි ඇති සෑම මූලද්‍රව්‍යයක් සඳහාම එක් ඇමතුමක් එක් වරක් ඇමතුම් ක්‍රමය, ආරෝහණ අනුපිළිවෙලින් , කෝල්බැක්එෆ්එන් ව්‍යාජ ලෙස ආපසු ලබා දෙන ස්ථානයක් සොයා ගන්නා තෙක්. 7 වන පියවර දෙස බලන්න. K 0 හා 8.e 1 කින් k වැඩි කරන්න.
Valdemar_Rudolfovich

80

එම්ඩීඑන් ප්‍රලේඛනයෙන්Array.prototype.forEach() උපුටා ගැනීම :

නැත නතර කිරීමට හෝ බිඳ දැමීම සඳහා කිසිදු ක්රමයක් වන forEach()ව්යතිරේකයක් වීසි හැර වෙනත් පුඩුවක්. ඔබට එවැනි හැසිරීමක් අවශ්‍ය නම්, .forEach()ක්‍රමය වැරදි මෙවලමකි , ඒ වෙනුවට සරල පුඩුවක් භාවිතා කරන්න. ඔබ සංජානන සඳහා අරාව අංග පරීක්ෂා හා වීජ ආපසු ලැබෙන අගය අවශ්ය නම්, ඔබ භාවිතා කළ හැකිය every()හෝ some()ඒ වෙනුවට.

ඔබේ කේතය සඳහා (ප්‍රශ්නයේ), @ බොබින්ස් යෝජනා කළ පරිදි, Array.prototype.some()ඒ වෙනුවට භාවිතා කරන්න. එය ඔබගේ භාවිතයට හොඳින් ගැලපේ.

Array.prototype.some()අරාවෙහි ඇති සෑම මූලද්‍රව්‍යයක් සඳහාම නැවත වරක් ඇමතුම් ලබා ගැනීමේ ශ්‍රිතය ක්‍රියාත්මක කරයි Boolean. එවැනි මූලද්රව්යයක් සොයාගතහොත්, some()වහාම සත්‍ය වේ. එසේ නොමැතිනම්, some()වැරදි ලෙස ආපසු එවීම. ඇමතුම් ලබා ගැනීම ඉල්ලා සිටින්නේ අගයන් පවරා ඇති අරාවේ දර්ශක සඳහා පමණි; මකාදැමූ හෝ කිසි විටෙකත් අගයන් පවරා නැති දර්ශක සඳහා එය ආයාචනා නොකෙරේ.


1
මෙය නිවැරදි පිළිතුරයි. 'සමහරු' කරන්නේ පුරෝකථනය / විවේකය කුමක් කරයිද යන්නයි. පුනරාවර්තනය n = සත්‍ය වන තෙක් එය ලූප වේ.
ඇන්ටනි බූත්

78

අවාසනාවට මෙම අවස්ථාවේදී ඔබ භාවිතා නොකරන්නේ නම් එය වඩා හොඳ වනු ඇත forEach. ඒ වෙනුවට සාමාන්‍ය forලූපයක් භාවිතා කරන්න , එය දැන් ඔබ අපේක්ෂා කළ ආකාරයටම ක්‍රියාත්මක වේ.

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

29
මෙම නිවැරදි පිළිතුරේ ඉහළ කාර්ය සාධනය, අඩු කේතය සහ වඩා හොඳ කියවීමේ හැකියාව සමඟ සසඳන විට ඉහළම ඡන්දය ලබා ගත හැකි නරකම ක්‍රියාත්මක කිරීම මට කම්පනයකි. ව්‍යතිරේකය විසි කරන්න ... ඇත්තටම? ලූප සඳහා සාම්ප්‍රදායික වන්නේ කෙවල් පමණක් ප්‍රමාණවත් නොවේද?
gdbj

2
@gdbj මම ඔබේ ප්‍රකාශයට එකඟ වන අතර මෙම ක්‍රමය භාවිතා කළෙමි, නමුත් ඇත්ත වශයෙන්ම මා කම්පනයට පත් කරවන කාරණය නම් මෙම හක්ක නොමැතිව සෑම එකක් සඳහාම පිටවීමට ක්‍රමයක් නොමැත, දැන් එය නරක නිර්මාණයකි.
ස්කොට් එන්

28

භාවිතා කිරීමට සලකා බලන්න jqueryගේ eachබොරු ඇතුළත callback කාර්යය නැවත කිරීමට ඉඩ නිසා, ක්රමය:

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

ලොඩාෂ් පුස්තකාල takeWhileසිතියම සමඟ දම්වැල් දැමිය හැකි / අඩු කළ හැකි / නැමිය හැකි ක්‍රමයක් ද සපයයි :

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');
// => []

1
JQuery භාවිතා කිරීමට හොඳ හේතුවක්. ස්වදේශික ජාවාස්ක්‍රිප්ට් හි සෑම එකක්ම තවමත් අඩුයි.
ඇලෙක්ස් ග්‍රෑන්ඩ්

3
LexAlexGrande jQuery හි forEach සහ JavaScript හි forEach අනුකූල නොවේ.
ජෝර්න්

11
JQuery විකල්පයක් නොවන බොහෝ ස්ථානවල JavaScript භාවිතා කරයි.
ජේබීආර් විල්කින්සන්


18

ඔබ ඩීන් එඩ්වඩ්ගේ යෝජනාව භාවිතා කිරීමට කැමති නම් සහ දෝෂය හසු නොවී පුඩුවෙන් පිටතට යාම සඳහා StopIteration දෝෂය විසි කරන්න, ඔබට පහත ශ්‍රිතය භාවිතා කළ හැකිය ( මුලින් මෙතැනින් ):

// 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;
        }
      }
    };
  }
})();

ඉහත කේතය මඟින් ඔබේම උත්සාහ කිරීමේ වගන්ති නොකර පහත සඳහන් කේත වැනි කේත ධාවනය කිරීමේ හැකියාව ලබා දෙනු ඇත:

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

මතක තබා ගත යුතු එක් වැදගත් කරුණක් නම්, මෙය යාවත්කාලීන වන්නේ Array.prototype.forEach ශ්‍රිතය දැනටමත් පවතී නම් පමණි. එය දැනටමත් නොපවතී නම්, එය එය වෙනස් නොකරනු ඇත.


13

කෙටි පිළිතුර: for...breakමේ සඳහා භාවිතා කරන්න හෝ ඔබේ කේතය වෙනස් නොකිරීමට භාවිතා කරන්න forEach. භාවිතා නොකරන්න .some()හෝ .every()සෑදීමේදී අනුගමනය කිරීමට for...break. for...breakලූපය වළක්වා ගැනීමට ඔබේ කේතය නැවත ලියන්න , නැතහොත් භාවිතා කරන්න for...break. for...breakවිකල්පයක් ලෙස ඔබ මෙම ක්‍රම භාවිතා කරන සෑම අවස්ථාවකම දෙවියන් වහන්සේ පූස් පැටවා මරා දමයි.

දිගු පිළිතුර:

.some()හා .every()නැවත යන booleanවටිනාකම, .some()ප්රතිලාභ trueශ්රිතයේ සම්මත වූ කිසිදු අංගයක් එහි නම් trueසෑම ප්රතිලාභ, falseශ්රිතයේ සම්මත වූ කිසිදු අංගයක් එහි නම් false. එම කාර්යයන් අදහස් කරන්නේ මෙයයි. ඔවුන් අදහස් නොකරන දේ සඳහා කාර්යයන් භාවිතා කිරීම වඩා නරක ය, පසුව CSS වෙනුවට පිරිසැලසුම සඳහා වගු භාවිතා කිරීම ඔබගේ කේතය කියවන සෑම කෙනෙකුම කලකිරීමට පත් කරයි.

එසේම, මෙම ක්‍රම for...breakවිකල්පයක් ලෙස භාවිතා කළ හැකි එකම ක්‍රමය වන්නේ අතුරු ආබාධ ඇති කිරීමයි ( .some()ඇමතුම් ආපසු ගැනීමේ ක්‍රියාවලියෙන් පිටත සමහර විචල්‍යයන් වෙනස් කිරීම ), මෙය මීට වඩා වෙනස් නොවේ for...break.

ඒ නිසා, භාවිතා .some()හෝ .every()ලෙස for...breakපුඩුවක් විකල්ප අතුරු ආබාධ රහිත නොවේ, එසේ නම් එහි පිරිසිදු නොවේ for...break, මේ අමිහිරි වේ, ඒ නිසා මෙම වඩා හොඳ නොවේ.

ඔබට සෑම විටම ඔබේ කේතය නැවත ලිවිය හැකි වන අතර එමඟින් අවශ්‍යතාවයක් නොමැත for...break. ඔබට අරාව භාවිතයෙන් පෙරහන් කළ හැකිය .filter(), ඔබට අරාව භාවිතා කර බෙදිය හැකිය .slice(), පසුව භාවිතා කරන්න .forEach()හෝ .map()අරාවෙහි එම කොටස සඳහා.


.filter භාවිතා කිරීම ඇත්ත වශයෙන්ම බිඳ දැමීම සඳහා බොහෝ භාවිත අවස්ථා සඳහා සුදුසු විසඳුම වේ.
TKoL

කාර්ය සාධනය ගැන කුමක් කිව හැකිද? නිතර භාවිතා කරන්නේ නම් Woudl පෙරණය ක්‍රියාකාරීත්වයට බලපාන්නේ නැද්ද?
tfrascaroli

ඔව්, පෙරහන් අරා මූලාකෘතියට බරක් විය හැකිය. මම එයට කැමතියි, නමුත් එය අධික ලෙස භාවිතා කළ හොත් එය ක්‍රියාකාරීත්වයට බලපෑම් කළ හැකිය.
චැඩ්

for...breakකාර්ය සාධනය අවශ්‍ය නම් ftfrascaroli ලූප භාවිතා කරන්න. forලූපය වඩා වඩාත් performant ප්රතිඵලයක්ම මෙවලමකි .forEach(), .any(), .map(), .filter()ආදිය
මැක්ස්


6

මෙය ගැටලුව විසඳීම සඳහා මා ඉදිරිපත් කළ දෙයක් පමණයි ... මුල් අසන්නාට තිබූ ගැටලුව එය විසඳන බව මට හොඳටම විශ්වාසයි:

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

ඉන්පසු ඔබ එය අමතන්නේ:

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

ඇමතුම් ආපසු ගැනීමේ ශ්‍රිතය තුළ සාවද්‍ය ලෙස නැවත පැමිණීම විවේකයක් ඇති කරයි. එය ඇත්ත වශයෙන්ම ක්‍රියාත්මක නොවන්නේ නම් මට දන්වන්න.


1
=== falseවඩා හොඳ විය හැකි බැවින් == false, ලූපය දිගටම කරගෙන යාම සඳහා ඔබට පැහැදිලිවම සත්‍යය (හෝ සත්‍ය වටිනාකමක්) ආපසු ලබා දිය යුතු නැත, සමහර පාලන මාවතකින් වටිනාකමක් නොලැබෙන අතර අනපේක්ෂිත ලෙස ලූපය කැඩී යයි.
ජේක්

6

මා ඉදිරිපත් කළ තවත් සංකල්පයක්:

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


වාක්‍ය ඛණ්ඩය [NSArray enumerateObjectsUsingBlock] ට සමානයි, ස්තූතියි!
Chrstph SLN

Ren ඩ්‍රෙනයිගේ අත්සන ස්වදේශිකයාට සමානය Array.prototype.forEach(). forහා breakමේ ප්රශ්නය විමසුවොත් පෙර දිගු පැවති; OP එම හැසිරීම සොයමින් සිටියේ වඩාත් ක්‍රියාකාරී , forEach.
c24w

@Drenai දැන් ඔවුන්ගේ අදහස් කලේ කර ඇත (නමුත් downvote දකුණට) මේ විසඳුම අත්සන මතක තබා ගැනීමට අපහසු හා අනවශ්ය බව ඔබට මේ ප්රශ්නය විසඳා හැකි විට සඳහන් වන for...inහා break.
c24w

5

මෙම විසඳුම වෙනත් වෙබ් අඩවියකින් හමු විය. ඔබට උත්සාහය / අල්ලා ගැනීමේ අවස්ථාවකදී සෑම එකක්ම ඔතා තැබිය හැකිය.

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

වැඩි විස්තර මෙතැනින්: http://dean.edwards.name/weblog/2006/07/enum/


2
පාලන ප්‍රවාහ ප්‍රකාශයක් ලෙස ව්‍යතිරේක භාවිතා නොකරන්න. අනපේක්ෂිත ප්‍රති .ල හැසිරවීම සඳහා එය භාවිතා කරන්න.
මැක්ස්

5

කලින් සඳහන් කළ පරිදි, ඔබට බිඳ දැමිය නොහැක .forEach().

මෙන්න ඊඑස් 6 ඉටරේටර්ස් සමඟ පුරෝකථනයක් කිරීමේ තරමක් නවීන ක්‍රමයක්. නැවත ක්‍රියාත්මක වන විට index/ වෙත access ජු ප්‍රවේශයක් ලබා ගැනීමට ඔබට ඉඩ දෙයි value.

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

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

ප්‍රතිදානය:

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

සබැඳි


4

නැවත සැකසීමෙන් පසු ඔබට ඔබේ අරාවට ප්‍රවේශ වීමට අවශ්‍ය නොවන්නේ නම්, අරාවෙහි දිග 0 ලෙස සැකසීමෙන් ඔබට ඇප ලබා ගත හැකිය.

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

හෝ ක්ලෝනයක් සමඟ:

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

එය වඩා හොඳ විසඳුමක් වන අතර පසුව ඔබේ කේතයේ අහඹු දෝෂ විසි කරන්න.


හොඳින් ඉටු කළ :) නමුත් පැවරීම පසු සමහර ක්රියාවන් පවතී නම් array.lengthකිරීමට 0ඔවුන් වත්මන් ප්රතිඵලයක්ම අදාළ වේ, ඒ නිසා සමහර විට එය සමහර හොඳ භාවිතය තියෙන්නේ returnඑවැනි අනුයුක්ත පසු
zhibirc

4

මෙය for for loop, නමුත් forEach () මෙන් ලූපයේ වස්තු යොමු කිරීම පවත්වා ගෙන යන නමුත් ඔබට කැඩී යා හැක.

var arr = [1,2,3];
for (var i = 0, el; el = arr[i]; i++) {
    if(el === 1) break;
}

3

තවත් ප්රවේශයක්

        var wageType = types.filter(function(element){
            if(e.params.data.text == element.name){ 
                return element;
            }
        });
        console.dir(wageType);

මෙය පෙරහන් ක්‍රමයේ නිවැරදි භාවිතයද? මම හිතන්නේ කෝල්බැක් බූලියන් එකක් ලබා දෙයි, එය නොසලකා, ඇමතුම අන්තිම එක දක්වා අරාව මූලද්‍රව්‍ය ලෙස හැඳින්වේ.
මෝර්ටෙසා

2

මම ඒ සඳහා nullhack භාවිතා කරමි , එය දේපල වෙත ප්‍රවේශ වීමට උත්සාහ කරයි, එය nullදෝෂයකි:

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
ඇයි නැත්තේ throw BREAK?
බර්ගි

ඔබට සරලව භාවිතා කළ හැකි FOOBAREDඅතර එය දෝෂයක් ඇති කරයි.
පැසීරියර්

1

ඔබේ forEachවාක්‍ය ඛණ්ඩය තබා ගැනීමට ඔබට අවශ්‍ය නම් , මෙය කාර්යක්ෂමව තබා ගත හැකි ක්‍රමයකි (සාමාන්‍ය ලූපයක් තරම් හොඳ නොවුනත්). ඔබට ලූපයෙන් පිටතට යාමට අවශ්‍ය දැයි දන්නා විචල්‍යයක් සඳහා වහාම පරීක්ෂා කරන්න.

මෙම උදාහරණය නිර්මානය සඳහා නිර්නාමික කාර්යය භාවිතා කාර්යය විෂය පථය වටා forEachඔබ ගබඩා කිරීම සඳහා අවශ්ය කරන සිදු තොරතුරු.

(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>

මගේ ශත දෙක.


1

මම දන්නවා එය නිවැරදි මාර්ගයක් නොවන බව. එය ලූපය බිඳ දැමීම නොවේ. එය ජුගාඩ් ය

let result = true;
[1, 2, 3].forEach(function(el) {
    if(result){
      console.log(el);
      if (el === 2){
        result = false;
      }
    }
});



0

ඉහළට ඔසවා ඇති බොබින්ස් සමඟ එකඟ වන්න.

එසේම, FYI:

Prototype.js සඳහා මේ සඳහා යමක් තිබේ:

<script type="text/javascript">
  $$('a').each(function(el, idx) {
    if ( /* break condition */ ) throw $break;
    // do something
  });
</script>

$break අභ්‍යන්තරව Prototype.js විසින් හසුරුවනු ලබන අතර එය "එක් එක්" චක්‍රය බිඳ දමමින් බාහිර දෝෂ ජනනය නොකරයි.

වැඩි විස්තර සඳහා Prototype.JS API බලන්න.

jQuery ට ද ක්‍රමයක් ඇත, කලින් ලූපය බිඳ දැමීම සඳහා හසුරුවන්නාගේ අසත්‍යය නැවත ලබා දෙන්න:

<script type="text/javascript">
  jQuery('a').each( function(idx) {
    if ( /* break condition */ ) return false;
    // do something

  });
</script>

විස්තර සඳහා jQuery API බලන්න.


0

මෙය වඩාත් කාර්යක්ෂම නොවේ, මන්ද ඔබ තවමත් සියලු අංග චක්‍රීය කර ඇති නමුත් එය ඉතා සරල ලෙස සලකා බැලීම වටී යැයි මම සිතුවෙමි:

let keepGoing = true;
things.forEach( (thing) => {
  if (noMore) keepGoing = false;
  if (keepGoing) {
     // do things with thing
  }
});

continueයතුරු පදයකි, ඔබේ කේතය සින්ටැක්ස් දෝෂයකි.
බර්ගි

3
ඔබට කෙසේ හෝ ES6 භාවිතා කරන්නේ බව ලබා දී, ඔබ යන්තම් මාරු කළ යුතු for ofපුඩුවක් හා break;සුපුරුදු පරිදි බව සිට.
බර්ගි

ස්ථාවර, සහ සත්‍ය - නමුත් බොහෝ විට භාවිතා කළේ සංක්ෂිප්තතාව සඳහා
es6

0

මට වැඩ කරන පහත කේතය ඔබට අනුගමනය කළ හැකිය:

 var     loopStop = false;
YOUR_ARRAY.forEach(function loop(){
    if(loopStop){ return; }
    if(condition){ loopStop = true; }
});

ඇයි -1? ව්‍යතිරේකයක් අල්ලා ගැනීමට වඩා එය කැත නොවේ, එය IMHO හි විශාල හැක් කිරීමකි.
බයිරන් විට්ලොක්

0

මම භාවිතා කිරීමට කැමතියි for in

var words = ['a', 'b', 'c'];
var text = '';
for (x in words) {
    if (words[x] == 'b') continue;
    text += words[x];
}
console.log(text);

for inබොහෝ දුරට ක්‍රියා කරන අතර forEach, ඔබට පිටවීමේ ශ්‍රිතයට නැවත එක් කළ හැකිය. වඩා හොඳ කාර්ය සාධනය ද ඇත.


0

ඔබගේ නඩුවේදී මෙන් දැනටමත් ඔබේ අරාවෙහි ඇති මූලද්‍රව්‍යවල වටිනාකම මත පදනම්ව ඔබට බිඳීමට අවශ්‍ය නම් (එනම්, බිඳීමේ තත්වය ධාවන කාල විචල්‍යය මත රඳා නොපවතින්නේ නම්, අරාව එහි මූලද්‍රව්‍ය අගයන් ලබා දීමෙන් පසුව වෙනස් විය හැක) ඔබට සංයෝජනය භාවිතා කළ හැකිය ක පෙත්තක් () හා indexOf () පහත සඳහන් පරිදි.

සෑම එකක්ම 'ඇපල්' වෙත ළඟා වූ විට ඔබට බිඳීමට අවශ්‍ය නම් ඔබට භාවිතා කළ හැකිය

var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
var fruitsToLoop = fruits.slice(0, fruits.indexOf("Apple"));
// fruitsToLoop = Banana,Orange,Lemon

fruitsToLoop.forEach(function(el) {
    // no need to break
});

W3Schools.com හි සඳහන් කර ඇති පරිදි, පෙත්ත () ක්‍රමය මඟින් අරාවෙහි තෝරාගත් අංග නව අරා වස්තුවක් ලෙස ලබා දෙයි. මුල් අරාව වෙනස් නොවේ.

එය JSFiddle හි බලන්න

එය යමෙකුට උපකාරී වේ යැයි සිතමි.


0

"සොයන්න" සමඟ උත්සාහ කරන්න:

var myCategories = [
 {category: "start", name: "Start", color: "#AC193D"},
 {category: "action", name: "Action", color: "#8C0095"},
 {category: "exit", name: "Exit", color: "#008A00"}
];

function findCategory(category) {
  return myCategories.find(function(element) {
    return element.category === category;
  });
}

console.log(findCategory("start"));
// output: { category: "start", name: "Start", color: "#AC193D" }

0

ඔබ ක ප්රභේද්යයක් නිර්මාණය කළ හැකිය forEachඒ සඳහා ඉඩ break, continue, return, සහ async/ await: (TypeScript ලියා උදාහරණයක් ලෙස)

export type LoopControlOp = "break" | "continue" | ["return", any];
export type LoopFunc<T> = (value: T, index: number, array: T[])=>LoopControlOp;

Array.prototype.ForEach = function ForEach<T>(this: T[], func: LoopFunc<T>) {
    for (let i = 0; i < this.length; i++) {
        const controlOp = func(this[i], i, this);
        if (controlOp == "break") break;
        if (controlOp == "continue") continue;
        if (controlOp instanceof Array) return controlOp[1];
    }
};

// this variant lets you use async/await in the loop-func, with the loop "awaiting" for each entry
Array.prototype.ForEachAsync = async function ForEachAsync<T>(this: T[], func: LoopFunc<T>) {
    for (let i = 0; i < this.length; i++) {
        const controlOp = await func(this[i], i, this);
        if (controlOp == "break") break;
        if (controlOp == "continue") continue;
        if (controlOp instanceof Array) return controlOp[1];
    }
};

භාවිතය:

function GetCoffee() {
    const cancelReason = peopleOnStreet.ForEach((person, index)=> {
        if (index == 0) return "continue";
        if (person.type == "friend") return "break";
        if (person.type == "boss") return ["return", "nevermind"];
    });
    if (cancelReason) console.log("Coffee canceled because: " + cancelReason);
}

-1

ඔව්, සෑම පුඩුවක්ම ඉදිරියට ගෙනයාමට සහ පිටවීමට හැකිය.

ඉදිරියට යාමට, ඔබට නැවත භාවිතා කළ හැකිය, ලූපය දිගටම පවතිනු ඇති නමුත් වත්මන් ශ්‍රිතය අවසන් වනු ඇත.

ලූපයෙන් පිටවීම සඳහා, ඔබට තෙවන පරාමිතිය දිග 0 ක් ලෙස සැකසිය හැකිය, හිස් අරාවකට සකසන්න. ලූපය දිගටම පවතින්නේ නැත, වත්මන් ශ්‍රිතය එසේ වේ, එබැවින් ඔබට නිමාව සඳහා "ආපසු" භාවිතා කළ හැකිය, සාමාන්‍යයෙන් ලූපයක් සඳහා පිටවීම වැනි ...

මෙය:

[1,2,3,4,5,6,7,8,9,10].forEach((a,b,c) => {
    console.log(a);
    if(b == 2){return;}
    if(b == 4){c.length = 0;return;}
    console.log("next...",b);
});

මෙය මුද්‍රණය කරයි:

1
next... 0
2
next... 1
3
4
next... 3
5

-2

පෙර, මගේ කේතය පහතින්

 this.state.itemsDataSource.forEach((item: any) => {
                if (!item.isByPass && (item.invoiceDate == null || item.invoiceNumber == 0)) {

                    return false;
                }
            });

මම පහලට වෙනස් කර ඇත, එය සවි කර ඇත.

 for (var i = 0; i < this.state.itemsDataSource.length; i++) {
                var item = this.state.itemsDataSource[i];
                if (!item.isByPass && (item.invoiceDate == null || item.invoiceNumber == 0)) {

                    return false;
                }
            }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.