ජාවාස්ක්‍රිප්ට් හි අරාවකට ඉහළින්


4686

ජාවාස්ක්‍රිප්ට් භාවිතයෙන් අරාවෙහි ඇති සියලුම ප්‍රවේශයන් හරහා මට ලූප කළ හැක්කේ කෙසේද?

මම හිතුවේ එය මේ වගේ දෙයක් කියලයි:

forEach(instance in theArray)

theArrayමගේ අරාව කොහෙද , නමුත් මෙය වැරදියි.


16
මම ඒ ගැන සොයා බැලුවෙමි, නමුත් මම සෙව්වේ forEach නිකම්ම නොවේ for. c # හි එය ටිකක් වෙනස් වූ අතර එය මා ව්‍යාකූල කළේය :)
Dante1986

6
ECMAScript & nbsp; 6 සමහර විට "සඳහා ... සඳහා" ඉදිකිරීම් අඩංගු වේ. වැඩි විස්තර සඳහා ... of (MDN) සඳහා බලන්න. මෑත කාලීන ෆයර්ෆොක්ස් අනුවාද සමඟ ඔබට එය දැනටමත් අත්හදා බැලිය හැකිය.
ස්ලේවන් රෙසික්

36
Array.ForEach ජාවාස්ක්‍රිප්ට් හි අරා සඳහා එක් එක් () ට වඩා 95% පමණ මන්දගාමී වේ. මෙම කාර්ය සාධන පරීක්ෂණය මාර්ගගතව බලන්න: jsperf.com/fast-array-foreach via coderwall.com/p/kvzbpa
molokoloco

77
මන්දගාමී 95% සැලකිය යුතු වීමට යන්නේ නැති බව බොහෝ අවස්ථාවන් සඳහා blog.niftysnippets.org/2012/02/foreach-and-runtime-cost.html
ඩේවිඩ් Sykes

7
ඊට වෙනස් ලෙස, දී Python එය වඩාත් කාර්යක්ෂම වළළු සඳහා සාම්ප්රදායික භාවිතය වඩා කාර්යයන් භාවිතා කිරීමට. (එම සලකා බලන්න i < lenසහ i++එන්ජිම විසින්, භාෂණ විසින් වඩා සිදු කළ හැක.)
joeytwiddle

Answers:


7024

ටීඑල්; ඩී.ආර්

  • ඔබ එය for-inආරක්ෂිතව භාවිතා කරන්නේ නම් හෝ අවම වශයෙන් එය ඔබට දෂ්ට කළ හැක්කේ මන්දැයි නොදැන සිටියහොත් භාවිතා නොකරන්න .
  • ඔබේ හොඳම ඔට්ටු ඇල්ලීම සාමාන්‍යයෙන් වේ

    • එය for-ofමහත් පිටුවහලක් වනු (ES2015 + පමණක්),
    • Array#forEach( spec| MDN) (හෝ එහි relatives someාතීන් සහ එවැනි) (ES5 + පමණි),
    • සරල පැරණි තාලයේ forලූපයක්,
    • හෝ for-inආරක්ෂිතව.

එහෙත්, එහි ගේ ගොඩක් වැඩි කියවීමට, ගවේෂණය කිරීමට ...


ජාවාස්ක්‍රිප්ට්හි අරා සහ අරා වැනි වස්තූන් හරහා ලූප කිරීම සඳහා ප්‍රබල අර්ථකථන ඇත. මම පිළිතුර කොටස් දෙකකට බෙදා ඇත: අව්‍යාජ අරා සඳහා විකල්ප, සහ වස්තුව, වෙනත් නැවත සැකසිය හැකි වස්තු (ES2015 +), DOM එකතු කිරීම් සහ යනාදිය වැනි අරාව වැනි දේ සඳහා විකල්ප arguments.

මම ඉක්මනින් ඔබ විකල්ප ES2015 භාවිතා කළ හැකි බව කරුණාවෙන් කරන්නම් දැන් පවා ES5 යන්ත්ර තුල, විසින් transpiling ES5 කිරීමට ES2015. වැඩි විස්තර සඳහා "ES2015 සම්ප්‍රේෂණය" / "ES6 සම්ප්‍රේෂණය" සඳහා සොයන්න ...

හරි, අපි අපගේ විකල්ප දෙස බලමු:

තථ්‍ය අරා සඳහා

ඔබට ECMAScript 5 ("ES5") හි විකල්ප තුනක් ඇත, මේ මොහොතේ වඩාත්ම පුළුල් ලෙස සහාය දක්වන අනුවාදය, සහ ECMAScript 2015 ("ES2015", "ES6") හි තවත් දෙකක් එකතු කර ඇත :

  1. භාවිතය forEachසහ අදාළ (ES5 +)
  2. සරල forපුඩුවක් භාවිතා කරන්න
  3. නිවැරදිව භාවිතා කරන්නfor-in
  4. භාවිතා කරන්න for-of(ව්‍යංගයෙන් iterator භාවිතා කරන්න ) (ES2015 +)
  5. පැහැදිලිවම iterator භාවිතා කරන්න (ES2015 +)

විස්තර:

1. භාවිතා කිරීම forEachහා අදාළ

ArrayES5 විසින් එකතු කරන ලද විශේෂාංග වෙත (සෘජුව හෝ පොලිෆිල්ස් භාවිතා කරමින්) ඔබට ප්‍රවේශය ඇති ඕනෑම නොපැහැදිලි-නවීන පරිසරයක (එබැවින්, IE8 නොවේ ), ඔබට භාවිතා කළ හැකිය forEach( spec| MDN):

var a = ["a", "b", "c"];
a.forEach(function(entry) {
    console.log(entry);
});

forEachඇමතුම් ආපසු ගැනීමේ ශ්‍රිතයක් පිළිගන්නා අතර, විකල්පයක් ලෙස, thisඑම ඇමතුම ඇමතීමේදී භාවිතා කළ යුතු අගයක් (ඉහත භාවිතා නොකෙරේ). අරාවෙහි එක් එක් ප්‍රවේශය සඳහා ඇමතුම් ලබා ගැනීම කැඳවනු ලැබේ, පිළිවෙලින්, විරල අරා වල නොපවතින ඇතුළත් කිරීම් මඟ හැරීම. මම ඉහත එක් තර්කයක් පමණක් භාවිතා කළද, ඇමතුම තුනකින් හැඳින්වේ: එක් එක් ප්‍රවේශයේ වටිනාකම, එම ප්‍රවේශයේ දර්ශකය, සහ ඔබ නැවත නැවත අරාව වෙත යොමු කිරීම (ඔබේ ශ්‍රිතය දැනටමත් එය සතුව නොමැති නම් ).

ඔබ IE8 වැනි යල්පැනගිය බ්‍රව්සර් සඳහා සහය නොදක්වන්නේ නම් (2016 සැප්තැම්බර් මාසයේදී මෙම ලිවීමට අනුව NetApps 4% කට වඩා වෙළඳපල කොටසකින් පෙන්වයි), ඔබට කිසිදු සතුටක් forEachනොමැතිව පොදු අරමුණු සහිත වෙබ් පිටුවක සතුටින් භාවිතා කළ හැකිය . යල්පැනගිය බ්‍රව්සර් සඳහා ඔබට සහාය වීමට අවශ්‍ය නම්, දිලිසීම / බහු පිරවීම forEachපහසුවෙන් සිදු කරයි (විකල්ප කිහිපයක් සඳහා "es5 shim" සොයන්න).

forEach පුනරාවර්තන ශ්‍රිතයට තර්ක ලෙස ඒවා සපයා ඇති බැවින්, එම විෂය පථය තුළ සුචිගත කිරීම් සහ අගය විචල්‍යයන් ප්‍රකාශ කිරීමට ඔබට අවශ්‍ය නොවන වාසියක් ඇත.

එක් එක් අරාව ඇතුළත් කිරීම සඳහා ක්‍රියාකාරී ඇමතුමක් ලබා ගැනීමේ ධාවන කාලය ගැන ඔබ කනස්සල්ලට පත්ව සිටී නම්, එසේ නොවන්න; විස්තර .

මීට අමතරව, forEach“ඒවා සියල්ලම හරහා ලූපය” ශ්‍රිතය වේ, නමුත් ES5 තවත් ප්‍රයෝජනවත් “අරාව හරහා වැඩ කර දේවල් කරන්න” යන කාර්යයන් කිහිපයක් නිර්වචනය කර ඇත.

  • every(පළමු වරට falseඇමතුම ආපසු පැමිණීම හෝ වැරදි දෙයක් සිදුවීම නතර කිරීම)
  • some( trueඇමතුම ආපසු පැමිණි විට හෝ සත්‍යවාදී යමක් පළමු වරට ලූප කිරීම නතර කරයි)
  • filter(එහිදී පෙරහන ශ්රිතයේ කොටස් ද ඇතුලු නව මාලාවක් නිර්මාණය trueහා එය නැවත ඇති අය සැර බාල false)
  • map (ඇමතුම් ලබා දීමෙන් ලැබෙන අගයන්ගෙන් නව අරාවක් නිර්මාණය කරයි)
  • reduce (නැවත නැවත ඇමතුමක් ලබා දීමෙන්, පෙර අගයන් පසුකරමින් වටිනාකමක් ගොඩනංවයි; විස්තර සඳහා පිරිවිතර බලන්න; අරාවෙහි අන්තර්ගතය සාරාංශ කිරීමට සහ තවත් බොහෝ දේ ප්‍රයෝජනවත් වේ)
  • reduceRight(වැනි reduce, නමුත් නැගී එන අනුපිළිවෙලට වඩා බැසයාමේ වැඩ කරයි)

2. සරල forලූපයක් භාවිතා කරන්න

සමහර විට පැරණි ක්‍රම හොඳම වේ:

var index;
var a = ["a", "b", "c"];
for (index = 0; index < a.length; ++index) {
    console.log(a[index]);
}

අරාව දිග කම්බියක් තුළ වෙනස් නොහැකි නම්, එය කාර්ය සාධන සංවේදී කේතය (අසම්භාව්ය) හි, මෙය, ඉදිරිපස දක්වා දිග පැහැර ගැනීම තරමක් වැඩි සංකීර්ණ අනුවාදය එකක් වෙන්න පුළුවන් කුඩා ටිකක් වේගවත්:

var index, len;
var a = ["a", "b", "c"];
for (index = 0, len = a.length; index < len; ++index) {
    console.log(a[index]);
}

සහ / හෝ පසුපසට ගණන් කිරීම:

var index;
var a = ["a", "b", "c"];
for (index = a.length - 1; index >= 0; --index) {
    console.log(a[index]);
}

නමුත් නවීන ජාවාස්ක්‍රිප්ට් එන්ජින් සමඟ, ඔබ අවසන් වරට යුෂ පානය කිරීම කලාතුරකිනි.

ES2015 සහ ඊට ඉහළින්, ඔබට ඔබේ දර්ශකය සහ අගය විචල්‍යයන් ලූපයට දේශීය කළ හැකිය for:

let a = ["a", "b", "c"];
for (let index = 0; index < a.length; ++index) {
    let value = a[index];
    console.log(index, value);
}
//console.log(index);   // would cause "ReferenceError: index is not defined"
//console.log(value);   // would cause "ReferenceError: value is not defined"

ඔබ එය කරන විට, එක් එක් ලූප පුනරාවර්තනය සඳහා පමණක් valueනොව indexප්‍රතිනිර්මාණය කරනු ලැබේ, එයින් අදහස් වන්නේ ලූප් ශරීරය තුළ නිර්මාණය කරන ලද වසා දැමීම් එම නිශ්චිත ක්‍රියාවලිය සඳහා නිර්මාණය කරන ලද index(සහ value) වෙත යොමු වීමකි:

let divs = document.querySelectorAll("div");
for (let index = 0; index < divs.length; ++index) {
    divs[index].addEventListener('click', e => {
        console.log("Index is: " + index);
    });
}

ඔබට බෙදීම් පහක් තිබුනේ නම්, ඔබ පළමු ක්ලික් කළහොත් ඔබට "දර්ශකය: 0" සහ අන්තිම ක්ලික් කළහොත් "දර්ශකය: 4" ලැබෙනු ඇත. මෙම වන්නේ නැහැ ඔබ භාවිතා කරන්නේ නම් වැඩ varවෙනුවට let.

3. නිවැරදිව භාවිතා කරන්නfor-in

ඔබ භාවිතා කිරීමට ඔබට කියන්නේ කරන්නම් for-in, නමුත් ඒ ගැන නෙවෙයි for-inසඳහා . අරාවෙහි දර්ශක නොව වස්තුවක ගණන් කළ නොහැකි ගුණාංගfor-in හරහා ලූප . ඇණවුම ES2015 (ES6) තුළ පවා සහතික නොවේ. ES2015 + මඟින් දේපල වස්තු කිරීම සඳහා ඇණවුමක් අර්ථ දක්වයි (හරහා , සහ ඒවා භාවිතා කරන දේවල් ), නමුත් එය එම අනුපිළිවෙල අනුගමනය කරනු ඇතැයි අර්ථ දක්වා නැත ; ES2020 කළා. ( මෙම අනෙක් පිළිතුරේ විස්තර .)[[OwnPropertyKeys]][[Enumerate]]Object.getOwnPropertyKeysfor-in

for-inඅරාව සඳහා ඇති එකම සැබෑ භාවිත අවස්ථා :

  • එය තියෙන්නේ විරල පෙලගැස්මක් සමග දැවැන්ත එය හිඩැස්, හෝ
  • ඔබ මූලද්‍රව්‍ය නොවන ගුණාංග භාවිතා කරන අතර ඔබට ඒවා ලූපයට ඇතුළත් කිරීමට අවශ්‍යය

එම පළමු උදාහරණය දෙස පමණක් බලන්න: ඔබ for-inසුදුසු ආරක්‍ෂණ ක්‍රම භාවිතා කරන්නේ නම් එම විරල අරා අංග බැලීමට ඔබට භාවිතා කළ හැකිය :

// `a` is a sparse array
var key;
var a = [];
a[0] = "a";
a[10] = "b";
a[10000] = "c";
for (key in a) {
    if (a.hasOwnProperty(key)  &&        // These checks are
        /^0$|^[1-9]\d*$/.test(key) &&    // explained
        key <= 4294967294                // below
        ) {
        console.log(a[key]);
    }
}

චෙක්පත් තුන සැලකිල්ලට ගන්න:

  1. වස්තුව එහි ඇති බව ඒ නම (එක් නොවන එහි මූලාකෘතිය සිට උරුම) විසින් දේපළ හා

  2. යතුර සියලු දශම සංඛ්‍යා (උදා: සාමාන්‍ය නූල් ආකෘතිය, විද්‍යාත්මක අංකනය නොවේ), සහ

  3. අංකයකට බල කරන විට යතුරේ අගය <= 2 ^ 32 - 2 (එය 4,294,967,294). එම අංකය පැමිණෙන්නේ කොහෙන්ද? එය පිරිවිතරයේ අරාව දර්ශකයේ අර්ථ දැක්වීමේ කොටසකි . වෙනත් සංඛ්‍යා (පූර්ණ සංඛ්‍යා නොවන, negative ණ සංඛ්‍යා, 2 ^ 32 - 2 ට වඩා වැඩි සංඛ්‍යා) අරාව දර්ශක නොවේ. එය 2 ^ 32 - 2 වීමට හේතුව, එමඟින් විශාලතම දර්ශක අගය 2 ^ 32 - 1 ට වඩා අඩු වීමයි, එය අරාවකට lengthතිබිය හැකි උපරිම අගය වේ . (උදා:, 32-bit නිලකුණු පූර්ණ සංඛ්යාමය දී මාලාවක් ගේ දිග පණ අදිමින් වුවත්.) (RobG කිරීමට මුක්කු අදහසක් දී පෙන්වා දෙමින් සඳහා මගේ බ්ලොග් මත මීට කලින් මගේ ටෙස්ට් හරි නැති බව.)

ඇත්ත වශයෙන්ම ඔබ එය පේළිගත කේතයෙන් නොකරනු ඇත. ඔබ උපයෝගිතා ශ්‍රිතයක් ලියනු ඇත. සමහර විට:

4. භාවිතා කරන්න for-of(ව්‍යංගයෙන් අනුකාරකයක් භාවිතා කරන්න ) (ES2015 +)

ES2015 එකතු iterators JavaScript කිරීමට. ඉරේටර භාවිතා කිරීමට ඇති පහසුම ක්‍රමය නව for-ofප්‍රකාශයයි. එය මේ වගේ ය:

const a = ["a", "b", "c"];
for (const val of a) {
    console.log(val);
}

ආවරණ යටතේ, එය අරාව වෙතින් අනුකාරකයක් ලබා ගෙන එය හරහා ලූප, එයින් අගයන් ලබා ගනී. මෙය භාවිතා කිරීමේ ගැටලුවක් නොමැත for-in, මන්ද එය වස්තුව (අරාව) මගින් නිර්වචනය කර ඇති අනුකාරකයක් භාවිතා කරන අතර අරා විසින් අර්ථ දක්වනුයේ ඒවායේ අනුකාරකයන් ඔවුන්ගේ ඇතුළත් කිරීම් හරහා (ඒවායේ ගුණාංග නොව) නැවත ක්‍රියාත්මක වන බවයි. for-inES5 හි මෙන් නොව , ඇතුළත් කිරීම් නැරඹූ අනුපිළිවෙල ඒවායේ දර්ශකවල සංඛ්‍යාත්මක අනුපිළිවෙලයි.

5. පැහැදිලිවම iterator භාවිතා කරන්න (ES2015 +)

සමහර විට, ඔබට පැහැදිලිවම iterator භාවිතා කිරීමට අවශ්‍ය විය හැකිය . ඔබටත් එය කළ හැකිය . එය මේ වගේ ය:for-of

const a = ["a", "b", "c"];
const it = a.values();
let entry;
while (!(entry = it.next()).done) {
    console.log(entry.value);
}

Iterator යනු පිරිවිතරයේ අනුකාරක අර්ථ දැක්වීමට ගැලපෙන වස්තුවකි. එහි nextක්‍රමය ඔබ එය අමතන සෑම අවස්ථාවකම නව ප්‍රති result ල වස්තුවක් ලබා දෙයි. ප්‍රති object ල වස්තුවට දේපලක් ඇත, doneඑය සිදු වී ඇත්දැයි අපට කියයි, සහ එම ක්‍රියාවලිය valueසඳහා වටිනාකමක් ඇති දේපලක් ඇත. ( doneඑය වනු ඇත නම් විකල්ප වේ false, valueඑය වනු ඇත නම් විකල්ප වේ undefined.)

valueඅනුකාරකය අනුව අර්ථය වෙනස් වේ; අරා ආධාරක (අවම වශයෙන්) පුනරාවර්තන නැවත ලබා දෙන කාර්යයන් තුනක්:

  • values(): මම ඉහත භාවිතා කළ ක්‍රමය මෙයයි. එය එක් එක් අවස්ථාවකට iterator නැවත valueබව ප්රතිඵලයක්ම සඳහා අරාව ප්රවේශයකි ( "a", "b"සහ "c"මීට පෙර උදාහරණය තුල).
  • keys(): එක් එක් අවස්ථාවකට iterator ආයෙත් valueබව ප්රතිඵලයක්ම සඳහා යතුර (එසේ අපගේ සඳහා aඉහත, ගත යුතු බවත් "0", එසේ නම් "1", එසේ නම් "2").
  • entries(): එක් එක් එම අර්‍ථනය valueසඳහා ආකෘතියේ අරාව ඇති අනුකාරකයක් [key, value]ලබා දෙයි.

අරාව වැනි වස්තු සඳහා

සත්‍ය අරා හැරුණු විට, සංඛ්‍යාත්මක නම් සහිත දේපළක් හා ගුණාංග ඇති අරාව වැනි වස්තූන් ද ඇත length: NodeListනිදසුන්, argumentsවස්තුව යනාදිය. ඒවායේ අන්තර්ගතය හරහා අප ලූප කරන්නේ කෙසේද?

අරා සඳහා ඉහත ඕනෑම විකල්පයක් භාවිතා කරන්න

ඉහත දැක්වෙන අරාව ප්‍රවේශයන් අවම වශයෙන් සමහරක්, සහ බොහෝ විට හෝ සියල්ලම, නිරන්තරයෙන් අරාව වැනි වස්තූන් සඳහා සමානවම අදාළ වේ:

  1. භාවිතය forEachසහ අදාළ (ES5 +)

    මත ඇති විවිධ කාර්යයන් Array.prototype"හිතාමතාම ජනක" වන අතර සාමාන්‍යයෙන් අරාව වැනි වස්තූන් හරහා Function#callහෝ හරහා භාවිතා කළ හැකිය Function#apply. ( මෙම පිළිතුර අවසානයේ ධාරක විසින් සපයන ලද වස්තූන් සඳහා Caveat බලන්න , නමුත් එය දුර්ලභ කාරණයක් වේ.)

    ඔබ භාවිතා කිරීමට අවශ්ය සිතන්න forEachමත Nodeගේ childNodesදේපළ. ඔබ මෙය කරනු ඇත:

    Array.prototype.forEach.call(node.childNodes, function(child) {
        // Do something with `child`
    });
    

    ඔබ එය බොහෝ දේ කිරීමට යන්නේ නම්, නැවත භාවිතා කිරීම සඳහා ශ්‍රිත යොමුවෙහි පිටපතක් විචල්‍යයකට ලබා ගැනීමට ඔබට අවශ්‍ය විය හැකිය, උදා:

    // (This is all presumably in some scoping function)
    var forEach = Array.prototype.forEach;
    
    // Then later...
    forEach.call(node.childNodes, function(child) {
        // Do something with `child`
    });
  2. සරල forපුඩුවක් භාවිතා කරන්න

    නිසැකවම, සරල forපුඩුවක් අරාව වැනි වස්තූන් සඳහා අදාළ වේ.

  3. නිවැරදිව භාවිතා කරන්නfor-in

    for-inඅරාව සමඟ ඇති එකම ආරක්‍ෂාව සමඟ අරාව වැනි වස්තූන් සමඟ ද ක්‍රියා කළ යුතුය; ඉහත # 1 හි ධාරක විසින් සපයන ලද වස්තු සඳහා වන අවවාදය අදාළ විය හැකිය.

  4. භාවිතා කරන්න for-of(ව්‍යංගයෙන් iterator භාවිතා කරන්න ) (ES2015 +)

    for-ofවස්තුව විසින් සපයන ලද iterator භාවිතා කරයි (ඇත්නම්). එයට සත්කාරක සපයන වස්තු ඇතුළත් වේ. උදාහරණයක් වශයෙන්, සඳහා පිරිවිතර NodeListසිට querySelectorAllප්රතිඵලයක්ම සහය දීමට යාවත් කරන ලදී. සඳහා පිරිවිතර HTMLCollectionසිට getElementsByTagNameනොවේ.

  5. පැහැදිලිවම iterator භාවිතා කරන්න (ES2015 +)

    # 4 බලන්න.

සත්‍ය අරාවක් සාදන්න

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

  1. sliceඅරා ක්‍රමය භාවිතා කරන්න

    අපට sliceඅරා ක්‍රමවේදය භාවිතා කළ හැකිය , ඉහත සඳහන් කළ වෙනත් ක්‍රම මෙන් “හිතාමතාම ජනක” වන අතර අරා වැනි වස්තූන් සමඟද භාවිතා කළ හැකිය:

    var trueArray = Array.prototype.slice.call(arrayLikeObject);

    උදාහරණයක් ලෙස, අපට NodeListසත්‍ය අරාව බවට පරිවර්තනය කිරීමට අවශ්‍ය නම් , අපට මෙය කළ හැකිය:

    var divs = Array.prototype.slice.call(document.querySelectorAll("div"));

    ධාරකයෙන් සපයන ලද වස්තු සඳහා Caveat බලන්න . විශේෂයෙන්, මෙය IE8 සහ ඊට පෙර අසමත් වන බව සලකන්න, එමඟින් සත්කාරක විසින් සපයන ලද වස්තු ඒ හා thisසමාන ලෙස භාවිතා කිරීමට ඔබට ඉඩ නොදේ .

  2. පැතිරීමේ සින්ටැක්ස් භාවිතා කරන්න ( ...)

    මෙම අංගයට සහය දක්වන ජාවාස්ක්‍රිප්ට් එන්ජින් සමඟ ES2015 හි පැතිරීමේ සින්ටැක්ස් භාවිතා කිරීමට ද හැකිය . හරියට for-of, මෙය වස්තුව විසින් සපයන ලද iterator භාවිතා කරයි (පෙර කොටසේ # 4 බලන්න):

    var trueArray = [...iterableObject];

    උදාහරණයක් ලෙස, අපට NodeListසත්‍ය අරා බවට පරිවර්තනය කිරීමට අවශ්‍ය නම් , පැතිරෙන සින්ටැක්ස් සමඟ මෙය තරමක් සංක්ෂිප්ත වේ:

    var divs = [...document.querySelectorAll("div")];
  3. භාවිත Array.from

    Array.from (පිරිවිතර) | (MDN) (ES2015 +, නමුත් පහසුවෙන් පොලිෆිල්ඩ්) අරාව වැනි වස්තුවකින් අරාවක් නිර්මාණය කරයි. ඒ නිසා:

    var divs = Array.from(document.querySelectorAll("div"));

    හෝ ඔබට දී ඇති පන්තියක් සමඟ මූලද්‍රව්‍යයන්ගේ ටැග් නම් පෙළක් ලබා ගැනීමට අවශ්‍ය නම්, ඔබ සිතියම්කරණ ශ්‍රිතය භාවිතා කරයි:

    // Arrow function (ES2015):
    var divs = Array.from(document.querySelectorAll(".some-class"), element => element.tagName);
    
    // Standard function (since `Array.from` can be shimmed):
    var divs = Array.from(document.querySelectorAll(".some-class"), function(element) {
        return element.tagName;
    });

ධාරකයෙන් සපයන ලද වස්තු සඳහා කේවියට්

ඔබ ධාරක-සපයන අරා වැනි වස්තූන් (ජාවාස්ක්‍රිප්ට් එන්ජිමට වඩා බ්‍රව්සරය විසින් සපයන ලද DOM ලැයිස්තු සහ වෙනත් දේ) Array.prototypeසමඟ කාර්යයන් භාවිතා කරන්නේ නම් , ධාරක විසින් සපයන ලද වස්තුව නිසි ලෙස හැසිරෙන බවට වග බලා ගැනීම සඳහා ඔබේ ඉලක්ක පරිසරයන් තුළ පරීක්ෂා කිරීමට වග බලා ගත යුතුය. . බොහෝ දෙනෙක් නිසි ලෙස හැසිරෙති (දැන්), නමුත් පරීක්ෂා කිරීම වැදගත්ය. හේතුව, ඔබ භාවිතා කිරීමට කැමති බොහෝ ක්‍රම වියුක්ත මෙහෙයුමට අවංක පිළිතුරක් ලබා දෙමින් ධාරක විසින් සපයන ලද වස්තුව මත රඳා සිටීමයි . මෙම ලිවීමට අනුව, බ්‍රව්සර් මේ සඳහා ඉතා හොඳ කාර්යයක් ඉටු කරයි, නමුත් 5.1 පිරිවිතර මඟින් ධාරක විසින් සපයන ලද වස්තුවක් අවංක නොවිය හැකිය. එය section8.6.2 හි ඇත , එම කොටසේ ආරම්භයට ආසන්නයේ විශාල වගුවට පහළින් ඡේද කිහිපයක්), එහි මෙසේ සඳහන් වේ:Array.prototype[[HasProperty]]

වෙනත් ආකාරයකින් දක්වා නොමැති නම් ධාරක වස්තු මෙම අභ්‍යන්තර ක්‍රම ඕනෑම ආකාරයකින් ක්‍රියාත්මක කළ හැකිය; උදාහරණයක් ලෙස, එක් හැකියාව බව ය [[Get]]සහ [[Put]]ඇත්ත වශයෙන්ම දේපළ වටිනාකම ෙනොලැබී සිටින නමුත් යම් සත්කාරක වස්තුව සඳහා [[HasProperty]]සෑම විටම ජනනය බොරු .

පොදු සත්කාරක-ලබා අරා වැනි නවීන බ්රවුසරයන් වස්තු ලියන මේ වන විට, (මම ES2015 පිරිවිතර ඒ සමාන verbiage සොයා ගත හැකි, නමුත් එය තවමත් මෙම නඩුව විය. බැඳී ඇති) නැවතත් [ NodeListඋදාහරණයක් අවස්ථා,] කරන්න හසුරුව [[HasProperty]]නිවැරදිව, නමුත් පරීක්ෂා කිරීම වැදගත් වේ.)


44
.forEachඑය කාර්යක්ෂමව බිඳ දැමිය නොහැකි එකතු කිරීමට ද මම කැමැත්තෙමි . විවේකය සිදු කිරීම සඳහා ඔබ ව්යතිරේකයක් විසි කළ යුතුය.
පිජුස්න්

82
Ius පියස්: ඔබට ලූපය බිඳ දැමීමට අවශ්‍ය නම් ඔබට භාවිතා කළ හැකිය some. (මම කැඩීමට ඉඩ දීමට කැමැත්තක් දැක්වුවෙමි forEach, නමුත් ඔවුන් මගෙන් විමසුවේ නැත. ;-))
ටී. ජේ. ක්‍රෝඩර්

6
JTJCrowder ඇත්ත, එය වැඩ කිරීමේ වටපිටාවක් මෙන් පෙනුනත් එය එහි මූලික අරමුණ නොවේ.
පිජුස්න්

8
@ user889030: ඔබ අවශ්ය ,පසු k=0නො, ;. මතක තබා ගන්න, ක්‍රමලේඛනය බොහෝ දේ වන අතර ඉන් එකක් සවිස්තරාත්මකව අවධානය යොමු කරයි ... :-)
ටී. ජේ. ක්‍රෝඩර්

5
Im ජිම්බ්: එය ඉහත ආවරණය කර ඇත ( lengthඑය ක්‍රමයක් නොවේ). :-)
ටී.ජේ ක්‍රෝඩර්

513

සටහන : මෙම පිළිතුර බලාපොරොත්තු රහිතව යල්පැන ඇති ය. වඩාත් නවීන ප්‍රවේශයක් සඳහා, අරාවෙහි ඇති ක්‍රම දෙස බලන්න . උනන්දුවක් දක්වන ක්‍රම විය හැක්කේ:

  • සෑම එකක් සඳහාම
  • සිතියම
  • පෙරහන
  • zip
  • අඩු කරන්න
  • සියලු
  • සමහර

ජාවාස්ක්‍රිප්ට් හි අරාව නැවත සැකසීමට සම්මත ක්‍රමය වැනිලා for-ලූප්:

var length = arr.length,
    element = null;
for (var i = 0; i < length; i++) {
  element = arr[i];
  // Do something with element
}

කෙසේ වෙතත්, මෙම ප්‍රවේශය යහපත් වන්නේ ඔබට ar න අරාවක් තිබේ නම් පමණක් බවත්, එක් එක් දර්ශකය මූලද්‍රව්‍යයක් විසින් අල්ලාගෙන සිටින බවත් සලකන්න. අරාව විරල නම්, ඔබට මෙම ප්‍රවේශය සමඟ කාර්ය සාධන ගැටළු වලට මුහුණ දිය හැකිය, මන්ද ඔබ අරාවෙහි සැබවින්ම නොපවතින දර්ශක රාශියක් හරහා නැවත ක්‍රියා කරනු ඇත . මෙම අවස්ථාවේ දී, for .. in-ලූප් වඩා හොඳ අදහසක් විය හැකිය. කෙසේ වෙතත් , අරාවෙහි අපේක්ෂිත ගුණාංග (එනම් අරාවෙහි මූලද්‍රව්‍ය) පමණක් ක්‍රියාත්මක වන බව සහතික කිරීම සඳහා ඔබ සුදුසු ආරක්ෂණ භාවිතා කළ යුතුය, මන්ද for..in-ලූප් ද පැරණි බ්‍රව්සර්වල ගණනය කරනු ලැබේ, නැතහොත් අතිරේක ගුණාංග ලෙස අර්ථ දක්වා තිබේ නම් enumerable.

දී සම්මතයන් 5 අරාව මූලාකෘති පිළිබඳ forEach ක්රමය වනු ඇත, නමුත් එය උරුමය බ්රව්සර සඳහා සහාය නොදක්වයි. එබැවින් එය නිරන්තරයෙන් භාවිතා කිරීමට ඔබට එක්කෝ එයට සහාය දෙන පරිසරයක් තිබිය යුතුය (නිදසුනක් ලෙස, ජාවාස්ක්‍රිප්ට් සඳහා සේවාදායකයේ Node.js ), හෝ “පොලිෆිල්” භාවිතා කරන්න. කෙසේ වෙතත්, මෙම ක්‍රියාකාරීත්වය සඳහා වන පොලිෆිල් ඉතා සුළු වන අතර එය කේතය කියවීමට පහසු කරවන බැවින් එය ඇතුළත් කිරීම හොඳ පොලිෆිල් වේ.


2
for(instance in objArray) නිවැරදි භාවිතයක් නොවන්නේ ඇයි ? එය මට වඩා සරල බව පෙනේ, නමුත් ඔබ එය භාවිතා කිරීම සඳහා නිවැරදි ක්‍රමයක් නොවන බව මට ඇසේ.
Dante1986

21
ඔබට පේළි දිග හැඹිලිය භාවිතා කළ හැකිය: සඳහා (var i = 0, l = arr.length; i <l; i ++)
රොබට් හොෆ්මන්

3
පළමු පේළියේ අවසානයේ කොමාව චේතනාන්විතද, නැතහොත් එය අක්ෂර වින්‍යාසයක්ද (අර්ධ සළකුණක් විය හැකිද)?
මොහොමඩ් අබ්දුල් මුජිබ්

6
@ වර්ධා-වෙබ් එය හිතාමතා ය. තනි- varපදයකින් බහු විචල්‍යයන් ප්‍රකාශ කිරීමට එය අපට හැකියාව ලබා දෙයි . අප අර්ධ elementසළකුණක් භාවිතා කළේ නම්, ගෝලීය විෂය පථය තුළ ප්‍රකාශයට පත් කිරීමට ඉඩ තිබුණි (නැතහොත්, නිෂ්පාදනයට ළඟා වීමට පෙර ජේඑස්හින්ට් අපට බැණ වදිනු ඇත).
PatrikAkerstrand

239

ඔබ jQuery පුස්තකාලය භාවිතා කරන්නේ නම් , ඔබට jQuery.each භාවිතා කළ හැකිය :

$.each(yourArray, function(index, value) {
  // do your stuff here
});

සංස්කරණය කරන්න :

ප්‍රශ්නයට අනුව, පරිශීලකයාට jquery වෙනුවට javascript හි කේත අවශ්‍ය බැවින් සංස්කරණය වේ

var length = yourArray.length;   
for (var i = 0; i < length; i++) {
  // Do something with yourArray[i].
}

2
මම බොහෝ විට මෙම පිළිතුර භාවිතා කිරීමට යන්නෙමි. එය ප්‍රශ්නයට හොඳම පිළිතුර නොවේ, නමුත් ප්‍රායෝගිකව jQuery භාවිතා කරන අපට සරලම හා වඩාත්ම අදාළ වනු ඇත. මම හිතන්නේ අපි හැමෝම වැනිලා ක්‍රමය ඉගෙන ගත යුතුයි. ඔබේ අවබෝධය පුළුල් කිරීමට එය කිසි විටෙකත් රිදවන්නේ නැත.
mopsyd

47
ඒ සඳහාම: jQuery එක් එක් ස්වදේශීය විසඳුම් වඩා මන්දගාමී වේ. හැකි සෑම විටම jQuery වෙනුවට ස්වදේශීය ජාවාස්ක්‍රිප්ට් භාවිතා කරන ලෙස jQuery විසින් උපදෙස් දෙනු ලැබේ. jsperf.com/browser-diet-jquery-each-vs-for-loop
කෙවින් ලොක්කා

8
ඔබට වැනිලා js භාවිතා කළ හැකි විට jQuery භාවිතා කිරීමෙන් වළකින්න
Noe

2
සම්මත JS වෙත ඇලී සිටින්න, ස්වදේශීය භාෂා විසඳුමක් නොමැති නම් තෙවන පාර්ශවීය පුස්තකාලවලට පිළිතුරෙන්
keep ත්ව සිටින්න

116

පිටුපසට වන්න

මම හිතන්නේ ලූප සඳහා ආපසු හැරවීම මෙහි සඳහන් කිරීම සුදුසුයි :

for (var i = array.length; i--; ) {
     // process array[i]
}

වාසි:

  • ඔබට තාවකාලික lenවිචල්‍යයක් ප්‍රකාශ කිරීමට අවශ්‍ය නැත , නැතහොත් array.lengthඑක් එක් පුනරාවර්තනය සමඟ සැසඳිය යුතුය, ඒ දෙකෙන් එකක් විනාඩි ප්‍රශස්තිකරණය විය හැකිය.
  • ප්‍රතිලෝම අනුපිළිවෙලින් DOM වෙතින් සහෝදර සහෝදරියන් ඉවත් කිරීම සාමාන්‍යයෙන් වඩා කාර්යක්ෂම වේ. (බ්‍රව්සරයට එහි අභ්‍යන්තර අරා වල මූලද්‍රව්‍ය මාරු කිරීම අඩු කළ යුතුය.)
  • ඔබ ලූපය අතරතුර අරාව වෙනස් කරන්නේ නම් , දර්ශකය i හි හෝ පසුව (උදාහරණයක් ලෙස ඔබ අයිතමයක් ඉවත් කිරීම හෝ ඇතුල් කිරීම array[i]), එවිට ඉදිරි ලූපයක් වමේ සිට අයි ස්ථානයට මාරුවූ අයිතමය මඟ හරිනු ඇත , නැතහොත් අයි අයිතමය නැවත සැකසීම දකුණට මාරු විය. පුඩුවක් සඳහා සාම්ප්රදායික, ඔබ හැකි යාවත්කාලීන i සකසන අවශ්ය බව ඊළඟ අයිතමයට යොමුකර කිරීමට - 1, නමුත් හුදෙක් පුනහ්කරණයක් දිශාව ප්රතිවිරුද්ධ බොහෝ විට ය සරල හා වඩා අලංකාර විසඳුමක් .
  • ඒ හා සමානව, කැදැලි DOM මූලද්‍රව්‍ය වෙනස් කිරීමේදී හෝ ඉවත් කිරීමේදී , ප්‍රතිලෝමව සැකසීම මඟින් දෝෂ මඟහරවා ගත හැකිය . නිදසුනක් වශයෙන්, දෙමාපියන්ගේ නෝඩ් එකක ළමයින් හැසිරවීමට පෙර එහි අභ්‍යන්තර HTML වෙනස් කිරීම සලකා බලන්න. ළමා නෝඩය ලඟා වන විට එය DOM වෙතින් වෙන් කරනු ලැබේ, දෙමව්පියන්ගේ අභ්‍යන්තර HTML ලිවීමේදී අලුතින් සාදන ලද දරුවෙකු විසින් එය ප්‍රතිස්ථාපනය කරනු ලැබේ.
  • එය කෙටි ටයිප් කිරීමට, සහ කියවීමට ලබා ගත හැකි වෙනත් විකල්ප සමහර වඩා. එය forEach()ES6 ට සහ නැති වුව ද for ... of.

අවාසි:

  • එය අයිතම ප්‍රතිලෝම අනුපිළිවෙලට සකසයි. ඔබ ප්‍රති results ල වලින් නව අරාවක් ගොඩනඟන්නේ නම් හෝ තිරය මත දේවල් මුද්‍රණය කරන්නේ නම්, ස්වභාවිකවම ප්‍රතිදානය මුල් අනුපිළිවෙලට සාපේක්ෂව ආපසු හරවනු ලැබේ .
  • ඔවුන්ගේ ඇණවුම රඳවා තබා ගැනීම සඳහා සහෝදර සහෝදරියන් පළමු දරුවා ලෙස නැවත නැවතත් DOM තුළට ඇතුළත් කිරීම අඩු කාර්යක්ෂමතාවයකින් යුක්ත වේ. (බ්‍රව්සරය විසින් දේවල් නිවැරදිව වෙනස් කිරීමට සිදුවනු ඇත.) DOM නෝඩ් කාර්යක්ෂමව හා පිළිවෙලට නිර්මාණය කිරීම සඳහා, ඉදිරියට ඉදිරියට ගොස් සාමාන්‍ය පරිදි එකතු කරන්න (තවද "ලේඛන කැබැල්ලක්" භාවිතා කරන්න).
  • ප්‍රතිලෝම ලූපය කනිෂ් develop සංවර්ධකයින්ට ව්‍යාකූල වේ. (ඔබේ දෘෂ්ටිය අනුව වාසියක් ලෙස ඔබ සලකනු ඇත.)

මම සෑම විටම එය භාවිතා කළ යුතුද?

ඉදිරියට යාමට ලූප් කිරීමට හොඳ හේතුවක් නොමැති නම් සමහර සංවර්ධකයින් පෙරනිමියෙන් ලූප සඳහා ප්‍රතිලෝම භාවිතා කරයි.

කාර්ය සාධනය සාමාන්‍යයෙන් සුළුපටු වුවත්, එය කෑගැසීම් වර්ග කරයි:

"ලැයිස්තුවේ ඇති සෑම අයිතමයක් සඳහාම මෙය කරන්න. මම ඇණවුම ගැන තැකීමක් නොකරමි!"

කෙසේ වෙතත් බව ප්රායෝගිකව නොහැකි , ඇත්ත වශයෙන්ම අරමුණ සඳහා විශ්වාසනීය පෙන්නුම් විට ඔබ එය එම අවස්ථා ඇදහිල්ල මදිකම නිසා කරන්න අනුපිළිවෙල ගැන පහසුකම්, හා ඇත්තටම කරන්න අවශ්ය පසුපසට පුඩුවක් කිරීමට. එබැවින් ඇත්ත වශයෙන්ම "නොසලකන්න" යන අභිප්‍රාය නිවැරදිව ප්‍රකාශ කිරීම සඳහා තවත් ඉදිකිරීමක් අවශ්‍ය වනු ඇත, එය ECMAScript ඇතුළු බොහෝ භාෂාවල දැනට නොමැති නමුත් උදාහරණයක් ලෙස හැඳින්විය හැක forEachUnordered().

ඇණවුම වැදගත් නොවන්නේ නම් සහ කාර්යක්ෂමතාව සැලකිලිමත් වන්නේ නම් (ක්‍රීඩාවක හෝ සජීවිකරණ එන්ජිමක අභ්‍යන්තරයේ ඇති පුඩුවේ), එවිට ආපසු යාමේ රටාව ලෙස ලූප සඳහා ප්‍රතිලෝම භාවිතා කිරීම පිළිගත හැකිය. පවතින කේතයේ ලූපයක් සඳහා ප්‍රතිලෝමයක් දැකීම අනිවාර්යයෙන්ම ඇණවුම අදාල නොවන බව මතක තබා ගන්න !

සෑම () සඳහාම භාවිතා කිරීම වඩා හොඳය

පොදුවේ ගත් කල, පැහැදිලිකම සහ ආරක්ෂාව වැඩි අවධානයක් යොමු කරන ඉහළ මට්ටමේ කේත සඳහා , මම කලින් නිර්දේශ Array::forEachකළේ ඔබේ පෙරනිමි රටාව ලෙස ලූප කිරීම සඳහා භාවිතා කිරීමටයි (මේ දිනවල මම භාවිතා කිරීමට කැමති වුවත් for..of). forEachප්‍රතිලෝම ලූපයකට වඩා කැමති වීමට හේතු :

  • කියවීම වඩාත් පැහැදිලිය.
  • එයින් ඇඟවෙන්නේ මා වාරණය තුළට මාරු නොවන බවයි (එය සෑම විටම දිගු forහා whileලූප වල සැඟවිය හැකි පුදුමයකි ).
  • එය ඔබට වසා දැමීම් සඳහා නොමිලේ විෂය පථයක් ලබා දෙයි.
  • එය දේශීය විචල්‍යයන් කාන්දු වීම සහ බාහිර විචල්‍යයන් සමඟ අහම්බෙන් ගැටීම (හා විකෘති) අඩු කරයි.

ඔබේ කේතයේ ලූප සඳහා ආපසු හැරවීම ඔබ දකින විට, එය හොඳ හේතුවක් නිසා එය ආපසු හරවන බවට ඉඟියක් වේ (සමහර විට ඉහත විස්තර කර ඇති එක් හේතුවක් විය හැකිය). සාම්ප්‍රදායික ඉදිරි ලූපයක් දැකීමෙන් ඇඟවෙන්නේ මාරුවීමක් සිදුවිය හැකි බවයි.

(අභිප්‍රාය පිළිබඳ සාකච්ඡාව ඔබට තේරුමක් නැතිනම්, ක්‍රමලේඛන විලාසය සහ ඔබේ මොළය පිළිබඳ ක්‍රොක්ෆර්ඩ්ගේ දේශනය නැරඹීමෙන් ඔබට සහ ඔබේ කේතයට ප්‍රයෝජන ගත හැකිය .)

දැන් භාවිතා කිරීම ඊටත් වඩා හොඳය.

යන්න ගැන විවාදයක් නැත for..ofහෝ forEach()වඩාත් ඇත:

පුද්ගලිකව, කාර්ය සාධනය හෝ අවම කිරීම ප්‍රධාන කරුණක් වී නොමැති නම්, කියවීමට පහසු යැයි පෙනෙන ඕනෑම දෙයක් භාවිතා කිරීමට මම නැඹුරු වෙමි. ඒ නිසා මේ දවස් භාවිතා කිරීමට මම කැමති for..ofවෙනුවට forEach(), එහෙත් මා භාවිතා කරනු ඇත mapහෝ filterහෝ findහෝ someඅදාළ විට. (මගේ සගයන් වෙනුවෙන්, මම භාවිතා කරන්නේ කලාතුරකිනි reduce.)


එය ක්‍රියාත්මක වන්නේ කෙසේද?

for (var i = 0; i < array.length; i++) { ... }   // Forwards

for (var i = array.length; i--; )    { ... }   // Reverse

ඔබ බව ඔබට පෙනී යනවා ඇති i--මැද වගන්තිය (අපි සාමාන්යයෙන් සාපේක්ෂව බලන්න එහිදී) වන අතර, පසුගිය වගන්තිය හිස් (අපි සාමාන්යයෙන් දකින තැන i++). එයින් අදහස් වන්නේ i--එය අඛණ්ඩව පවත්වාගෙන යාමේ කොන්දේසිය ලෙස ද භාවිතා වන බවයි. තීරණාත්මක ලෙස, එය එක් එක් පුනරාවර්තනයට පෙර ක්‍රියාත්මක කර පරීක්ෂා කරනු ලැබේ.

  • array.lengthපුපුරා යාමකින් තොරව එය ආරම්භ කරන්නේ කෙසේද ?

    නිසා i--ලකුණු පෙර සේම සෑම පළමු ප්රතිඵලය මත අපි සැබවින්ම දී අයිතමය ප්රවේශ වනු ඇත array.length - 1සමග මොන යම් හෝ ප්රශ්න කිරීම වලකයි Array-යල්-සීමාවන් undefined භාණ්ඩ.

  • 0 දර්ශකයට පෙර එය නැවතීම නතර නොකරන්නේ ඇයි?

    තත්වය i--වැරදි අගයකට තක්සේරු කළ විට (එය 0 ලබා දෙන විට) ලූපය නැවත ක්‍රියා කිරීම නවත්වනු ඇත .

    උපක්‍රමය නම් --i, පසුපස i--ක්‍රියාකරු අඩු වන iනමුත් අඩුවීමට පෙර අගය ලබා දෙයි . ඔබේ කොන්සෝලයට මෙය නිරූපණය කළ හැකිය:

    > var i = 5; [i, i--, i];

    [5, 5, 4]

    අවසාන පුනරාවර්තනයේදී, මම මීට පෙර 1 ක් වූ අතර i--ප්‍රකාශනය එය 0 ට වෙනස් කළ නමුත් ඇත්ත වශයෙන්ම 1 (සත්‍ය) ලබා දෙයි , එබැවින් තත්වය පහව යයි. ඊළඟ පුනරාවර්තනයේදී i සිට -1 දක්වා i--වෙනස් වන නමුත් 0 (ෆෝල්සි) ields ලදාවක් ලබා දෙන අතර එමඟින් ක්‍රියාත්මක කිරීම වහාම ලූපයේ පතුලෙන් බැස යයි.

    පුඩුවක් සඳහා සාම්ප්රදායික ඉදිරියට දී, i++හා ++i(ඩග්ලස් Crockford පවසන ලෙස) එකිනෙකට හුවමාරු වේ. කෙසේ වෙතත්, ලූප සඳහා ප්‍රතිලෝමයේදී, අපගේ අඩුවීම අපගේ තත්ව ප්‍රකාශනය වන හෙයින්, අපට i--අයිතමය 0 දර්ශකයේ සැකසීමට අවශ්‍ය නම් අප එයට ඇලී සිටිය යුතුය .


ට්‍රිවියා

සමහර අය ප්‍රතිලෝම forපුඩුවේ කුඩා ඊතලයක් ඇඳීමට කැමතියි .

for (var i = array.length; i --> 0 ;) {

ලූප සඳහා ප්‍රතිලෝමයේ ප්‍රතිලාභ සහ භීෂණය මට පෙන්වීම සඳහා බැර කිරීම් WYL වෙත යයි.


3
මිණුම් සලකුණු එකතු කිරීමට මට අමතක විය . 6502 වැනි බිටු 8 ප්‍රොසෙසර වල ප්‍රතිලෝම ලූපය සැලකිය යුතු ප්‍රශස්තිකරණයක් වන්නේ කෙසේද යන්න සඳහන් කිරීමට මට අමතක විය, එහිදී ඔබට සැසඳීම නොමිලේ ලැබෙනු ඇත!
joeytwiddle

එකම පිළිතුර මෙහි වඩා සංක්ෂිප්තව ලබා දී ඇත (වෙනත් ප්‍රශ්නයකට).
joeytwiddle

84

සමහර සී- ස්ටයිල් භාෂා foreachගණන් බැලීම් හරහා ලූප භාවිතා කරයි. ජාවාස්ක්‍රිප්ට් හි මෙය for..inලූප් ව්‍යුහය සමඟ සිදු කරයි :

var index,
    value;
for (index in obj) {
    value = obj[index];
}

අල්ලා ගැනීමක් තිබේ. for..inඑක් එක් වස්තුවෙහි ගණන් කළ නොහැකි සාමාජිකයන් සහ එහි මූලාකෘතියේ සාමාජිකයන් හරහා ලූපය. වස්තුවේ මූලාකෘතිය හරහා උරුම වී ඇති අගයන් කියවීම වළක්වා ගැනීම සඳහා, දේපල වස්තුවට අයත් දැයි පරීක්ෂා කරන්න:

for (i in obj) {
    if (obj.hasOwnProperty(i)) {
        //do stuff
    }
}

මීට අමතරව, ECMAScript 5 විසින් කැල්බැක් භාවිතා කරමින් අරාව ගණනය කිරීම සඳහා භාවිතා කළ හැකි forEachක්‍රමවේදයක් එකතු කර ඇත Array.prototype(පොලිෆිල් ලේඛනයේ ඇත, එබැවින් ඔබට එය තවමත් පැරණි බ්‍රව්සර් සඳහා භාවිතා කළ හැකිය):

arr.forEach(function (val, index, theArray) {
    //do stuff
});

Array.prototype.forEachඇමතුම ආපසු පැමිණෙන විට එය කැඩී නොයන බව සටහන් කර ගැනීම වැදගත්ය false. jQuery සහ Underscore.jseach කෙටි පරිපථ කළ හැකි ලූප ලබා දීම සඳහා ඔවුන්ගේම වෙනස්කම් සපයයි.


3
ඉතින් අපි සාමාන්‍යයෙන් ලූප සඳහා හෝ සී-ස්ටයිල් භාෂාවලින් සොයාගත හැකි ෆෝරාච් ලූපයක් වැනි aa ECMAScript5 foreach loop එකෙන් බිඳී යන්නේ කෙසේද?
සියරන් ගැලගර්

5
Ia CiaranG, ජාවාස්ක්‍රිප්ට් හි, ලූපයෙන් කැඩීමට භාවිතා කිරීමට eachඉඩ දෙන ක්‍රම දැකීම සාමාන්‍ය දෙයකි return false, නමුත් forEachමෙය විකල්පයක් නොවේ. බාහිර ධජයක් භාවිතා කළ හැකිය (එනම් if (flag) return;, එය සෙසු ක්‍රියාකාරී ශරීරය ක්‍රියාත්මක වීම වලක්වනු ඇත, forEachඑය තවමත් මුළු
එකතුවටම නැවත ක්‍රියාත්මක

43

ඔබට අරාව හරහා ලූප කිරීමට අවශ්‍ය නම්, සම්මත කොටස් තුනක forලූපය භාවිතා කරන්න.

for (var i = 0; i < myArray.length; i++) {
    var arrayItem = myArray[i];
}

myArray.lengthපසුපසට හැඹිලියෙන් හෝ නැවත සැකසීමෙන් ඔබට යම් කාර්ය සාධන ප්‍රශස්තිකරණයක් ලබා ගත හැකිය .


6
සඳහා (var i = 0, length = myArray.length; i <length; i ++) එය කළ යුතුය
එඩ්සන් මෙඩිනා

5
DsEdsonMedina එය නව ගෝලීය විචල්‍යයක් ද නිර්මාණය කරයි length. ;)
joeytwiddle

4
@joeytwiddle ඔව්, නමුත් එය මෙම තනතුරේ සීමාවෙන් ඔබ්බට ය. ඔබ කෙසේ හෝ ගෝලීය විචල්‍යයක් සාදනු ඇත.
එඩ්සන් මෙඩිනා

6
Ds එඩ්සන් මෙඩිනා මගේ සමාව ඉල්ලීම, මට එය සම්පූර්ණයෙන්ම වැරදිය. භාවිතා ,පැවරුමක් පසු වන්නේ නැත , නව ගෝලීය හඳුන්වා ඔබේ යෝජනාව වන්නේ හුදෙක් එසේ දඩ ! මම මෙය වෙනත් ගැටළුවක් සඳහා ව්‍යාකූල කර ගතිමි: =පැවරුමකට පසුව භාවිතා කිරීමෙන් නව ගෝලීයත්වයක් නිර්මාණය වේ.
joeytwiddle

විචල්ය විචල්යය මම ලූපයට දේශීය නොවේ . JavaScript හි වාරණ විෂය පථයක් නොමැත. var i, length, arrayItem;මෙම වරදවා වටහා ගැනීම වළක්වා ගැනීම සඳහා ලූපයට පෙර ප්‍රකාශ කිරීම වඩා හොඳය .
ජේම්ස්

35

මෙය පැරණි පෝස්ට් එකක් බව මම දනිමි, දැනටමත් හොඳ පිළිතුරු බොහොමයක් තිබේ. තව ටිකක් සම්පූර්ණ වීම සඳහා මම සිතුවේ මම AngularJS භාවිතා කරමින් තවත් එකකට විසි කරන බවයි. ඇත්ත වශයෙන්ම, මෙය අදාළ වන්නේ ඔබ කෝණික භාවිතා කරන්නේ නම් පමණි, පැහැදිලිවම, කෙසේ වෙතත් මම එය කෙසේ හෝ තැබීමට කැමැත්තෙමි.

angular.forEachතර්ක 2 ක් සහ විකල්ප තෙවන තර්කයක් ගනී. පළමු තර්කය වන්නේ නැවත නැවත යෙදීමට ඇති වස්තුව (අරාව), දෙවන තර්කය iterator ශ්‍රිතය වන අතර විකල්ප තෙවන තර්කය වස්තු සන්දර්භයයි (මූලික වශයෙන් ලූපය තුළ 'මෙය' ලෙස හැඳින්වේ.

සෑම කෝණික කෝණයක්ම භාවිතා කිරීමට විවිධ ක්‍රම තිබේ. සරලම හා බොහෝ විට භාවිතා වන්නේ

var temp = [1, 2, 3];
angular.forEach(temp, function(item) {
    //item will be each element in the array
    //do something
});

එක් අරාවකින් තවත් පෙළකට අයිතම පිටපත් කිරීම සඳහා ප්‍රයෝජනවත් වන තවත් ක්‍රමයක් නම්

var temp = [1, 2, 3];
var temp2 = [];
angular.forEach(temp, function(item) {
    this.push(item); //"this" refers to the array passed into the optional third parameter so, in this case, temp2.
}, temp2);

ඔබට එය කිරීමට අවශ්‍ය නැතත්, ඔබට පහත සඳහන් දෑ කළ හැකි අතර එය පෙර උදාහරණයට සමාන වේ:

angular.forEach(temp, function(item) {
    temp2.push(item);
});

දැන් angular.forEachවැනිලා රසකාරක forපුඩුවට සාදා ඇති ආකාරයට වඩා ශ්‍රිතය භාවිතා කිරීමේ වාසි සහ අවාසි ඇත.

වාසි

  • පහසුවෙන් කියවිය හැකි බව
  • පහසුවෙන් ලිවීමේ හැකියාව
  • තිබේ නම්, angular.forEachසෑම ලූපයක් සඳහාම ES5 භාවිතා කරනු ඇත. සෑම ලූපයක්ම ලූප සඳහා වඩා මන්දගාමී බැවින් දැන් මම අවාසි අංශයේ කාර්යක්ෂමතාවයට පිවිසෙන්නෙමි . මම මෙය ගැති ලෙස සඳහන් කරන්නේ ස්ථාවර හා ප්‍රමිතිගත වීම සතුටක්.

පහත සඳහන් කැදැලි ලූප 2 සලකා බලන්න, එය හරියටම එකම දේ කරයි. අපට කියනුයේ අපට වස්තු 2 ක් ඇති අතර සෑම වස්තුවකම ප්‍රති results ල රාශියක් අඩංගු වන අතර, ඒ සෑම එකක්ම වටිනාකමක් ඇති දේපලකි. තවද අපි එක් එක් ප්‍රති results ල ගැන නැවත කියවිය යුතු යැයි කියමු. ඒවා සමාන නම් යම් ක්‍රියාමාර්ගයක් ගන්න:

angular.forEach(obj1.results, function(result1) {
    angular.forEach(obj2.results, function(result2) {
        if (result1.Value === result2.Value) {
            //do something
        }
    });
});

//exact same with a for loop
for (var i = 0; i < obj1.results.length; i++) {
    for (var j = 0; j < obj2.results.length; j++) {
        if (obj1.results[i].Value === obj2.results[j].Value) {
            //do something
        }
    }
}

මෙය ඉතා සරල උපකල්පිත උදාහරණයකි, නමුත් මම දෙවන ප්‍රවේශය භාවිතා කරමින් ලූප සඳහා ත්‍රිත්ව කාවැද්දූ අතර එය කියවීම ඉතා අපහසු වූ අතර ඒ සඳහා ලිවීමි.

අවාසි

  • කාර්යක්ෂමතාව. angular.forEach, සහ ස්වදේශිකයා forEach, සාමාන්‍ය ලූපයට වඩා මන්දගාමී forවේ .... 90% ක් පමණ මන්දගාමී වේ. එබැවින් විශාල දත්ත කට්ටල සඳහා, ස්වදේශීය forලූපයට ඇලී සිටීම වඩාත් සුදුසුය .
  • විවේකයක්, අඛණ්ඩව හෝ ආපසු සහාය නොදක්වයි. continueඇත්ත වශයෙන්ම " අහම්බෙන් " සහය දක්වයි , angular.forEachඔබ දිගටම කරගෙන යාමට සරල return;ප්‍රකාශයක් ශ්‍රිතයට ඇතුළත් කරන්න, angular.forEach(array, function(item) { if (someConditionIsTrue) return; });එමඟින් එම ක්‍රියාවලිය සඳහා ශ්‍රිතයෙන් ඉවත්වීමට එය හේතු වේ. මෙයට හේතුව ස්වදේශිකයා forEachවිවේකයට හෝ ඉදිරියට යාමට සහාය නොදක්වන බැවිනි.

මට විශ්වාසයි වෙනත් වාසි සහ අවාසි ද ඇති අතර කරුණාකර ඔබට සුදුසු යැයි පෙනෙන ඕනෑම දෙයක් එකතු කිරීමට නිදහස් වන්න. පහළ මට්ටමේ, ඔබට කාර්යක්ෂමතාව අවශ්‍ය නම්, forඔබේ ලූප අවශ්‍යතා සඳහා ස්වදේශීය ලූපය සමඟ රැඳී සිටින්න . එහෙත්, ඔබේ දත්ත කට්ටල කුඩා නම් සහ කියවීමේ හැකියාව සහ ලිවීමේ හැකියාව වෙනුවට යම් කාර්යක්ෂමතාවයක් අත්හැරීමට නම්, සෑම අතින්ම angular.forEachඑම නරක පිරිමි ළමයා තුළට විසි කරන්න .


34

අරාව හිස් කිරීමට ඔබට අවශ්‍ය නැතිනම්:

var x;

while(x = y.pop()){ 

    alert(x); //do something 

}

xහි අවසාන අගය අඩංගු වන yඅතර එය අරාවෙන් ඉවත් කරනු ලැබේ. shift()පළමු අයිතමය ලබා දෙන සහ ඉවත් කරන දේද ඔබට භාවිතා කළ හැකිය y.


4
ඔබට වැනි විරල අරාවක් තිබේ නම් එය ක්‍රියා නොකරයි [1, 2, undefined, 3].
එම්. ග්‍රිසිවැක්ස්වි

2
... හෝ ඇත්ත වශයෙන්ම කිසිවක් වැරදියි: [1, 2, 0, 3]හෝ[true, true, false, true]
ජොයිට්විඩ්ල්

31

forEach ක්රියාත්මක කිරීම ( jsFiddle දකින ):

function forEach(list,callback) {
  var length = list.length;
  for (var n = 0; n < length; n++) {
    callback.call(list[n]);
  }
}

var myArray = ['hello','world'];

forEach(
  myArray,
  function(){
    alert(this); // do something
  }
);

2
මෙහි iterator, අනවශ්‍ය දිග ගණනය කිරීමක් කරයි. පරිපූර්ණ අවස්ථාවක, ලැයිස්තු දිග ගණනය කළ යුත්තේ එක් වරක් පමණි.
මිධුන් ක්‍රිෂ්ණා

2
@MidhunKrishna මම මගේ පිළිතුර සහ jsFiddle යාවත්කාලීන කළ නමුත් එය ඔබ සිතන තරම් සරල නොවන බව දැන ගන්න. මෙම ප්‍රශ්නය
nmoliveira

2
: පූර්ණ හා දකුණු ක්රියාත්මක කිරීම මෙහි සොයා ගත හැකි ය developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
marciowb

29

බොහෝ විට for(i = 0; i < array.length; i++)ලූපය හොඳම තේරීම නොවේ. මන්ද? ඔබට මෙය තිබේ නම්:

var array = new Array();
array[1] = "Hello";
array[7] = "World";
array[11] = "!";

මෙම ක්රමය සිට කැඳවන array[0]කිරීමට array[2]. පළමුවෙන්ම, මෙය පළමුව ඔබ සතුව නොමැති විචල්‍යයන් යොමු කරයි, දෙවනුව ඔබට අරාවෙහි විචල්‍යයන් නොතිබෙනු ඇත, තෙවනුව මෙය කේතය නිර්භීත කරයි. මෙන්න බලන්න, මම භාවිතා කරන්නේ එයයි:

for(var i in array){
    var el = array[i];
    //If you want 'i' to be INT just put parseInt(i)
    //Do something with el
}

ඔබට එය ශ්‍රිතයක් වීමට අවශ්‍ය නම්, ඔබට මෙය කළ හැකිය:

function foreach(array, call){
    for(var i in array){
        call(array[i]);
    }
}

ඔබට බිඳීමට අවශ්‍ය නම්, තව ටිකක් තර්කනය:

function foreach(array, call){
    for(var i in array){
        if(call(array[i]) == false){
            break;
        }
    }
}

උදාහරණයක්:

foreach(array, function(el){
    if(el != "!"){
        console.log(el);
    } else {
        console.log(el+"!!");
    }
});

එය නැවත පැමිණේ:

//Hello
//World
//!!!

29

JQueryforeach හි ක්‍රියාත්මක කිරීම් තුනක් පහත පරිදි වේ.

var a = [3,2];

$(a).each(function(){console.log(this.valueOf())}); //Method 1
$.each(a, function(){console.log(this.valueOf())}); //Method 2
$.each($(a), function(){console.log(this.valueOf())}); //Method 3

2
කොන්සෝල ලොගය නිරූපණය සඳහා පමණි. එය සෙන්ටිමීටර ධාවන උදාහරණයක් බවට පත් කිරීමයි.
රාජේෂ් පෝල්

29

ECMAScript 6 වන විට:

list = [0, 1, 2, 3]
for (let obj of list) {
    console.log(obj)
}

එහිදී ofසම්බන්ධ වී ඇති අමුතුකම් මඟහරවා inඑය forවෙනත් භාෂාවක ලූපය මෙන් ක්‍රියා කරන අතර ශ්‍රිතය තුළට වඩා ලූපය තුළ letබන්ධනය වේ i.

{}එක් විධානයක් පමණක් ඇති විට වරහන් ( ) මඟ හැරිය හැක (උදා: ඉහත උදාහරණයේ).


28

දැන් පහසු විසඳුමක් වනුයේ underscore.js පුස්තකාලය භාවිතා කිරීමයි . එය බොහෝ ප්‍රයෝජනවත් මෙවලම් සපයන eachඅතර forEach, තිබේ නම් එම කාර්යය ස්වදේශිකයාට ස්වයංක්‍රීයව පවරනු ඇත.

එය ක්‍රියාත්මක වන ආකාරය පිළිබඳ කෝඩ්පෙන් උදාහරණයක් :

var arr = ["elemA", "elemB", "elemC"];
_.each(arr, function(elem, index, ar)
{
...
});

මෙයද බලන්න


23

for eachස්වදේශීය ජාවාස්ක්‍රිප්ට් හි කිසිදු ලූපයක් නොමැත . ඔබට මෙම ක්‍රියාකාරීත්වය ලබා ගැනීමට පුස්තකාල භාවිතා කළ හැකිය (මම නිර්දේශ කරන්නේ Underscore.js ), සරල forලූපයක් භාවිතා කරන්න .

for (var instance in objects) {
   ...
}

කෙසේ වෙතත්, ඊටත් වඩා සරල forපුඩුවක් භාවිතා කිරීමට හේතු තිබිය හැකි බව සලකන්න (අට්ටාල පිටාර ගැලීමේ ප්‍රශ්නය බලන්න අරාව පුනරාවර්තනය සමඟ “සඳහා… in” භාවිතා කිරීම එතරම් නරක අදහසක් වන්නේ ඇයි? )

var instance;
for (var i=0; i < objects.length; i++) {
    var instance = objects[i];
    ...
}

22

මෙය NON- විරල ලැයිස්තුව සඳහා අනුකාරකයක් වන අතර දර්ශකය 0 සිට ආරම්භ වන අතර එය document.getElementsByTagName හෝ document.querySelectorAll සමඟ ගනුදෙනු කිරීමේදී සාමාන්‍ය අවස්ථාවකි)

function each( fn, data ) {

    if(typeof fn == 'string')
        eval('fn = function(data, i){' + fn + '}');

    for(var i=0, L=this.length; i < L; i++) 
        fn.call( this[i], data, i );   

    return this;
}

Array.prototype.each = each;  

භාවිතයට උදාහරණ:

උදාහරණ # 1

var arr = [];
[1, 2, 3].each( function(a){ a.push( this * this}, arr);
arr = [1, 4, 9]

උදාහරණ # 2

each.call(document.getElementsByTagName('p'), "this.className = data;",'blue');

සෑම p ටැගයක්ම ලැබේ class="blue"

උදාහරණ # 3

each.call(document.getElementsByTagName('p'), 
    "if( i % 2 == 0) this.className = data;",
    'red'
);

අනෙක් සෑම p ටැගයක්ම class="red"> ලබා ගනී

උදාහරණ # 4

each.call(document.querySelectorAll('p.blue'), 
    function(newClass, i) {
        if( i < 20 )
            this.className = newClass;
    }, 'green'
);

අවසාන වශයෙන් පළමු නිල් p ටැග් 20 කොළ පාටට වෙනස් වේ

ශ්‍රිතය ලෙස නූල් භාවිතා කිරීමේදී ප්‍රවේශම් වන්න: ශ්‍රිතය සන්දර්භයෙන් බැහැරව නිර්මාණය කර ඇති අතර එය භාවිතා කළ යුත්තේ ඔබ විචල්‍ය විෂය පථය පිළිබඳ නිශ්චිත තැනක පමණි. එසේ නොමැති නම්, විෂය පථය වඩාත් බුද්ධිමත් වන කාර්යයන් සමත් කිරීම වඩා හොඳය.


21

ඇත කිහිපයක් ක්රම ලෙස පහත, ජාවා ස්ක්රිප්ට් දී මාලාවක් හරහා පුඩුවක් කිරීමට:

සඳහා - එය වඩාත් පොදු එකකි . ලූප් කිරීම සඳහා කේතයේ සම්පූර්ණ කොටස

var languages = ["Java", "JavaScript", "C#", "Python"];
var i, len, text;
for (i = 0, len = languages.length, text = ""; i < len; i++) {
    text += languages[i] + "<br>";
}
document.getElementById("example").innerHTML = text;
<p id="example"></p>

අතර - කොන්දේසියක් පවතින අතරතුර ලූපය. එය වේගවත්ම ලූපය බව පෙනේ

var text = "";
var i = 0;
while (i < 10) {
    text +=  i + ") something<br>";
    i++;
}
document.getElementById("example").innerHTML = text;
<p id="example"></p>

කරන්න / අතර - තත්වය සත්‍ය වන අතර කේත වාරණයක් හරහා ලූප් කරන්න, අවම වශයෙන් එක් වරක්වත් ක්‍රියාත්මක වේ

var text = ""
var i = 0;

do {
    text += i + ") something <br>";
    i++;
}
while (i < 10);

document.getElementById("example").innerHTML = text;
<p id="example"></p>

ක්රියාකාරී වළළු - forEach, map, filter, ද reduce(ඔවුන් මෙම උත්සවය හරහා පුඩුවක්, නමුත් ඔවුන්, ඔබ ඔබේ සමඟ වස්තූන් යමක් කිරීමට අවශ්ය නම් භාවිතා ආදිය

// For example, in this case we loop through the number and double them up using the map function
var numbers = [65, 44, 12, 4];
document.getElementById("example").innerHTML = numbers.map(function(num){return num * 2});
<p id="example"></p>

අරා වල ක්‍රියාකාරී ක්‍රමලේඛනය පිළිබඳ වැඩි විස්තර සහ උදාහරණ සඳහා, බ්ලොග් සටහන බලන්න ජාවාස්ක්‍රිප්ට් හි ක්‍රියාකාරී වැඩසටහන්: සිතියම, පෙරණය සහ අඩු කරන්න .


කුඩා නිවැරදි කිරීම: forEachඑය "ක්‍රියාකාරී" පුඩුවක් නොවේ, මන්ද එය නව එකක් ආපසු නොදෙන හෙයිනි Array(ඇත්ත වශයෙන්ම එය කිසිවක් ආපසු නොදෙනු ඇත), එය නැවත ක්‍රියාත්මක වේ.
nicholaswmin

19

අරා සමඟ වැඩ කිරීමට ECMAScript 5 (JavaScript හි අනුවාදය):

forEach - අරාවෙහි ඇති සෑම අයිතමයක් හරහාම වෙනස් වන අතර එක් එක් අයිතමය සමඟ ඔබට අවශ්‍ය ඕනෑම දෙයක් කරන්න.

['C', 'D', 'E'].forEach(function(element, index) {
  console.log(element + " is #" + (index+1) + " in the musical scale");
});

// Output
// C is the #1 in musical scale
// D is the #2 in musical scale
// E is the #3 in musical scale

යම්කිසි ආදාන අංගයක් භාවිතා කරමින් අරාව මත ක්‍රියා කිරීමට වැඩි කැමැත්තක් දක්වයි.

සිතියම - ඇමතුම් ආපසු ගැනීමේ ශ්‍රිතයේ ප්‍රති result ලය සමඟ එය නව අරාවක් නිර්මාණය කරයි. ඔබේ අරාවේ මූලද්‍රව්‍ය ආකෘතිකරණය කිරීමට අවශ්‍ය විට මෙම ක්‍රමය භාවිතා කිරීම හොඳය.

// Let's upper case the items in the array
['bob', 'joe', 'jen'].map(function(elem) {
  return elem.toUpperCase();
});

// Output: ['BOB', 'JOE', 'JEN']

අඩු කරන්න - නම පවසන පරිදි, එය වත්මන් මූලද්‍රව්‍යයේ දී ඇති ශ්‍රිතය පසු කිරීම සහ පෙර ක්‍රියාත්මක කිරීමේ ප්‍රති result ලය ඇමතීමෙන් අරාව තනි අගයකට අඩු කරයි.

[1,2,3,4].reduce(function(previous, current) {
  return previous + current;
});
// Output: 10
// 1st iteration: previous=1, current=2 => result=3
// 2nd iteration: previous=3, current=3 => result=6
// 3rd iteration: previous=6, current=4 => result=10

සෑම - අරාවෙහි ඇති සියලුම අංග ඇමතුම් ආපසු ගැනීමේ ශ්‍රිතය තුළ පරීක්ෂණයෙන් සමත් වුවහොත් සත්‍ය හෝ අසත්‍යය ලබා දෙයි.

// Check if everybody has 18 years old of more.
var ages = [30, 43, 18, 5];
ages.every(function(elem) {
  return elem >= 18;
});

// Output: false

පෙරණය - ලබා දී ඇති ශ්‍රිතයට සත්‍ය ලෙස නැවත පැමිණෙන මූලද්‍රව්‍යයන් සමඟ පෙරනයක් අරාව ලබා දෙයි.

// Finding the even numbers
[1,2,3,4,5,6].filter(function(elem){
  return (elem % 2 == 0)
});

// Output: [2,4,6]

16

ඇතුළුවීමට හැකියාවක් නැත forEach. ක්‍රියාත්මක කිරීමට බාධා කිරීම සඳහා Array#someපහත සඳහන් දෑ භාවිතා කරන්න :

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

මෙය someක්‍රියාත්මක වන්නේ අරාව අනුපිළිවෙලින් ක්‍රියාත්මක කර ඇති ඕනෑම ඇමතුමක් ලැබුණු විගසම සත්‍ය වන අතර ඉතිරි කොටස ක්‍රියාත්මක කිරීමට කෙටි පරිපථයකි. මුල් පිළිතුර සමහරක් සඳහා අරේ මූලාකෘතිය බලන්න


13

මෙය ප්‍රතිලෝම පුඩුවේ සංයුතියක් ලෙසත්, මෙම වාක්‍ය ඛණ්ඩයට කැමති කෙනෙකුට ඉහත පිළිතුරක් ලෙසත් එක් කිරීමට මම කැමැත්තෙමි.

var foo = [object,object,object];
for (var i = foo.length, item; item = foo[--i];) {
    console.log(item);
}

වාසි:

මේ සඳහා වන ප්‍රතිලාභය: ඔබට දැනටමත් පළමු වැනි සඳහනක් ඇති අතර පසුව වෙනත් පේළියක් සමඟ ප්‍රකාශ කිරීම අවශ්‍ය නොවේ. වස්තු අරාව ඇදගෙන යාමේදී එය පහසුය.

අවාසි:

යොමුව අසත්‍ය වූ විට මෙය කැඩී යනු ඇත - අසත්‍යය (නිර්වචනය නොකළ, ආදිය). එය වාසියක් ලෙස භාවිතා කළ හැකිය. කෙසේ වෙතත්, එය කියවීමට ටිකක් අපහසු වනු ඇත. තවද බ්‍රව්සරය මත පදනම්ව එය මුල් එකට වඩා වේගයෙන් වැඩ කිරීමට "ප්‍රශස්තිකරණය" කළ නොහැක.


12

භාවිතා කරන jQuery ක්‍රමය $.map:

var data = [1, 2, 3, 4, 5, 6, 7];

var newData = $.map(data, function(element) {
    if (element % 2 == 0) {
        return element;
    }
});

// newData = [2, 4, 6];

1
මම හිතන්නේ ප්‍රතිදානය වැඩි වීමට ඉඩ ඇත [undefined, 2, undefined, 4, undefined, 6, undefined].

10

ECMAScript 6 විනාශ කිරීම සහ පැතිරීමේ ක්‍රියාකරු සමඟ ලූප භාවිතා කිරීම

සමහර ජාවාස්ක්‍රිප්ට් ප්‍රවීණයන් එය අවුල් සහගත යැයි සලකනු ලැබුවද, පැතිරීමේ ක්‍රියාකරු විනාශ කිරීම සහ භාවිතා කිරීම ඊසීමාස්ක්‍රිප්ට් 6 වෙත නවකයන්ට වඩා ප්‍රයෝජනවත් බව ඔප්පු වී ඇත. කණිෂ් ors යන් හෝ වෙනත් පුද්ගලයින් එය ප්‍රයෝජනවත් විය හැකිය.

පහත උදාහරණ මඟින් for...ofප්‍රකාශය සහ .forEachක්‍රමය භාවිතා කරනු ඇත.

උදාහරණ 6, 7, සහ 8 වැනි ඕනෑම ක්රියාකාරී වළළු සමග භාවිතා කල හැකි .map, .filter, .reduce, .sort, .every, .some. මෙම ක්‍රම පිළිබඳ වැඩි විස්තර සඳහා, අරාව වස්තුව බලන්න .

උදාහරණ 1: සාමාන්‍ය for...ofලූපය - මෙහි උපක්‍රම නොමැත.

let arrSimple = ['a', 'b', 'c'];

for (let letter of arrSimple) {
  console.log(letter);
}

උදාහරණ 2: වචන අක්ෂර වලට බෙදන්න

let arrFruits = ['apple', 'orange', 'banana'];

for (let [firstLetter, ...restOfTheWord] of arrFruits) {
  // Create a shallow copy using the spread operator
  let [lastLetter] = [...restOfTheWord].reverse();
  console.log(firstLetter, lastLetter, restOfTheWord);
}

උදාහරණ 3: a keyසහvalue

// let arrSimple = ['a', 'b', 'c'];

// Instead of keeping an index in `i` as per example `for(let i = 0 ; i<arrSimple.length;i++)`
// this example will use a multi-dimensional array of the following format type:
// `arrWithIndex: [number, string][]`

let arrWithIndex = [
  [0, 'a'],
  [1, 'b'],
  [2, 'c'],
];

// Same thing can be achieved using `.map` method
// let arrWithIndex = arrSimple.map((i, idx) => [idx, i]);

// Same thing can be achieved using `Object.entries`
// NOTE: `Object.entries` method doesn't work on Internet Explorer  unless it's polyfilled
// let arrWithIndex = Object.entries(arrSimple);

for (let [key, value] of arrWithIndex) {
  console.log(key, value);
}

උදාහරණ 4: වස්තු ගුණාංග පේළියෙන් ලබා ගන්න

let arrWithObjects = [{
    name: 'Jon',
    age: 32
  },
  {
    name: 'Elise',
    age: 33
  }
];

for (let { name, age: aliasForAge } of arrWithObjects) {
  console.log(name, aliasForAge);
}

උදාහරණ 5: ඔබට අවශ්‍ය දේවල ගැඹුරු වස්තු ගුණාංග ලබා ගන්න

let arrWithObjectsWithArr = [{
    name: 'Jon',
    age: 32,
    tags: ['driver', 'chef', 'jogger']
  },
  {
    name: 'Elise',
    age: 33,
    tags: ['best chef', 'singer', 'dancer']
  }
];

for (let { name, tags: [firstItemFromTags, ...restOfTags] } of arrWithObjectsWithArr) {
  console.log(name, firstItemFromTags, restOfTags);
}

උදාහරණ 6: වන්නේද උදාහරණ 3 සමග භාවිතා.forEach

let arrWithIndex = [
  [0, 'a'],
  [1, 'b'],
  [2, 'c'],
];

// Not to be confused here, `forEachIndex` is the real index
// `mappedIndex` was created by "another user", so you can't really trust it

arrWithIndex.forEach(([mappedIndex, item], forEachIndex) => {
  console.log(forEachIndex, mappedIndex, item);
});

උදාහරණයක් 7: වන්නේද උදාහරණ 4 සමග භාවිතා.forEach

let arrWithObjects = [{
    name: 'Jon',
    age: 32
  },
  {
    name: 'Elise',
    age: 33
  }
];
// NOTE: Destructuring objects while using shorthand functions
// are required to be surrounded by parentheses
arrWithObjects.forEach( ({ name, age: aliasForAge }) => {
  console.log(name, aliasForAge)
});

උදාහරණයක් 8: වන්නේද උදාහරණ 5 සමග භාවිතා.forEach

let arrWithObjectsWithArr = [{
    name: 'Jon',
    age: 32,
    tags: ['driver', 'chef', 'jogger']
  },
  {
    name: 'Elise',
    age: 33,
    tags: ['best chef', 'singer', 'dancer']
  }
];

arrWithObjectsWithArr.forEach(({
  name,
  tags: [firstItemFromTags, ...restOfTags]
}) => {
  console.log(name, firstItemFromTags, restOfTags);
});


7

ඔබේ අදහසට සමීපතම ක්‍රමයක් වනුයේ සංවෘත Array.forEach()ශ්‍රිතයක් පිළිගන්නා භාවිතා කිරීම අරාවෙහි එක් එක් මූලද්‍රව්‍යය සඳහා ක්‍රියාත්මක වේ.

myArray.forEach(
  (item) => {
    // Do something
    console.log(item);
  }
);

තවත් ශක්‍ය ක්‍රමයක් වනුයේ Array.map()එකම ආකාරයකින් ක්‍රියා කරන දේ භාවිතා කිරීමයි, නමුත් එය ඔබ ආපසු ලබා දෙන සියලු අගයන් ගෙන ඒවා නව අරාවකට ගෙන එයි (අත්‍යවශ්‍යයෙන්ම සෑම අංගයක්ම නව එකක් වෙත සිතියම් ගත කිරීම),

var myArray = [1, 2, 3];
myArray = myArray.map(
  (item) => {
    return item + 1;
  }
);

console.log(myArray); // [2, 3, 4]

1
මෙය වැරදියි, mapඅරාවෙහි මූලද්‍රව්‍ය විකෘති නොකරයි, මන්ද එය නව අරාවක් ලබා දෙන අතර, එම නව අයිතමයන් පැරණි අරාවෙහි අයිතමවලට ශ්‍රිතය යෙදීමේ ප්‍රති result ලයකි.
ජෙසීස් ෆ්‍රැන්කෝ

මම කවදාවත් කිව්වේ නැහැ එය නව අරාවක් ලබා නොදෙන බව, මම සඳහන් කළේ ශ්‍රිතය විසින් යොදන ලද වෙනස ගැනයි. නමුත් මෙන්න මම එය පිළිතුරෙන් වෙනස් කරමි.
ඇන්ටේ ජබ්ලාන් ඇඩමොවික්

නැවත වැරදි, සිතියම් මුල් සැරසී සියලු ද්රව්ය වෙනස් කිරීම හෝ එක වෙසන් වෙනවා නැහැ, මම සමග වැඩ සිතියම අවධාරණය පිළිතුර යෝජනා සහ සංස්කරණය කරන්න තියෙනවා පිටපතක් සියලු දී තාප්පයෙන් මුල් රැසක් පිටත්, මුල් අයිතම
යේසුස් ෆ්රැන්කෝ

7

ඔබට මේ ආකාරයට සෑම කෙනෙකුටම ඇමතිය හැකිය:

forEachඔබ සපයන අරාව හරහා නැවත ක්‍රියාත්මක වන අතර එක් එක් නැවතීමේ ක්‍රියාවලිය සඳහා එම පුනරාවර්තනයේ elementවටිනාකම දරයි. ඔබට දර්ශකය අවශ්‍ය නම් iforEach සඳහා වන ඇමතුම් ආපසු ගැනීමේ ශ්‍රිතයේ දෙවන පරාමිතිය ලෙස සම්මත කිරීමෙන් වත්මන් දර්ශකය ලබා ගත හැකිය .

Foreach මූලික වශයෙන් ඉහළ ඇණවුම් ශ්‍රිතයක් වන අතර එය එහි පරාමිතිය ලෙස තවත් ශ්‍රිතයක් ගනී.

let theArray= [1,3,2];

theArray.forEach((element) => {
  // Use the element of the array
  console.log(element)
}

ප්‍රතිදානය:

1
3
2

ඔබට මෙවැනි අරා එකක් හරහා නැවත යෙදිය හැකිය:

for (let i=0; i<theArray.length; i++) {
  console.log(i); // i will have the value of each index
}

6

ඊතල ශ්‍රිතය සමඟ වස්තු සමූහයක් හරහා ලූප කිරීමට ඔබට අවශ්‍ය නම්:

let arr = [{name:'john', age:50}, {name:'clark', age:19}, {name:'mohan', age:26}];

arr.forEach((person)=>{
  console.log('I am ' + person.name + ' and I am ' + person.age + ' old');
})


6

ලැම්බඩා සින්ටැක්ස් සාමාන්‍යයෙන් ඉන්ටර්නෙට් එක්ස්ප්ලෝරර් 10 හෝ ඊට පහළින් ක්‍රියා නොකරයි.

මම සාමාන්‍යයෙන් භාවිතා කරන්නේ

[].forEach.call(arrayName,function(value,index){
    console.log("value of the looped element" + value);
    console.log("index of the looped element" + index);
});

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

$("#ul>li").each(function(**index, value**){
    console.log("value of the looped element" + value);
    console.log("index of the looped element" + index);
});

5

ඔබ සතුව දැවැන්ත අරාවක් තිබේ නම් iteratorsයම් කාර්යක්ෂමතාවයක් ලබා ගැනීමට ඔබ භාවිතා කළ යුතුය . Iterators (වගේ සමහර JavaScript එකතු ක දේපළ වේ Map, Set, String, Array). පවා, යටින් හුඩ් for..ofභාවිතා කරයි iterator.

ලැයිස්තුවේ ඇති අයිතම එකවර ප්‍රවාහයක් ලෙස පරිභෝජනය කිරීමට ඉඩ දීමෙන් අනුකාරකයන් කාර්යක්ෂමතාව වැඩි කරයි. Iterator විශේෂ වන්නේ එය එකතුවක් හරහා ගමන් කරන ආකාරයයි. වෙනත් ලූපයන් විසින් මුළු එකතුවම පෙරට ගෙන ඒම සඳහා එය නැවත පැටවීම අවශ්‍ය වේ.

ඔබ වත්මන් අයිතමයට ප්‍රවේශ වන්නේ iterator ගේ nextක්‍රමය ඇමතීමෙන් ය . ඊළඟ ක්‍රමය මඟින් valueවත්මන් අයිතමය නැවත booleanලබා දෙනු ඇති අතර ඔබ එකතු කිරීමේ අවසානයට ළඟා වූ විට දැක්වීමට a . පහත දැක්වෙන්නේ අරාවකින් අනුකාරකයක් සෑදීම සඳහා උදාහරණයකි.

values()මෙවැනි ක්‍රමයක් භාවිතා කරමින් ඔබේ සාමාන්‍ය අරාව අනුකාරකයට පරිවර්තනය කරන්න :

    const myArr = [2,3,4]

let it = myArr.values();

console.log(it.next());
console.log(it.next());
console.log(it.next());
console.log(it.next());

Symbol.iteratorමේ ආකාරයට භාවිතා කරමින් ඔබේ නිත්‍ය අරාව අනුකාරකයට පරිවර්තනය කළ හැකිය :

const myArr = [2,3,4]

let it = myArr[Symbol.iterator]();

console.log(it.next());
console.log(it.next());
console.log(it.next());
console.log(it.next());

ඔබ ද ඔබේ සාමාන්ය පරිවර්තනය විය හැකිය arrayයනු සඳහා iteratorමේ වගේ:

let myArr = [8, 10, 12];

function makeIterator(array) {
    var nextIndex = 0;
    
    return {
       next: function() {
           return nextIndex < array.length ?
               {value: array[nextIndex++], done: false} :
               {done: true};
       }
    };
};

var it = makeIterator(myArr);

console.log(it.next().value);   // {value: 8, done: false}
console.log(it.next().value);   // {value: 10, done: false}
console.log(it.next().value);   // {value: 12, done: false}
console.log(it.next().value);   // {value: undefined, done: true}

සටහන :

  • අනුභව කරන්නන් ස්වභාව ධර්මයෙන් වෙහෙසට පත්ව සිටිති.
  • වස්තු iterableපෙරනිමියෙන් නොවේ . for..inඅගයන් වෙනුවට එය යතුරු සමඟ ක්‍රියා කරන නිසා එම අවස්ථාවේ දී භාවිතා කරන්න .

ඔබට iteration protocol මෙහි වැඩි විස්තර කියවිය හැකිය .


5

ඔබට භාවිතා කිරීමට අවශ්‍ය නම් forEach(), එය පෙනෙන්නේ -

theArray.forEach ( element => {
    console.log(element);
});

ඔබට භාවිතා කිරීමට අවශ්‍ය නම් for(), එය පෙනෙන්නේ -

for(let idx = 0; idx < theArray.length; idx++){
    let element = theArray[idx];
    console.log(element);
}

4

නව යාවත්කාලීන කරන ලද ECMAScript 6 (ES6) සහ ECMAScript 2015 අනුව, ඔබට පහත දැක්වෙන විකල්ප ලූප සමඟ භාවිතා කළ හැකිය:

ලූප සඳහා

for(var i = 0; i < 5; i++){
  console.log(i);
}

// Output: 0,1,2,3,4

සඳහා ... ලූප වලින්

let obj = {"a":1, "b":2}

for(let k in obj){
  console.log(k)
}

// Output: a,b

Array.forEach ()

let array = [1,2,3,4]

array.forEach((x) => {
  console.log(x);
})

// Output: 1,2,3,4

සඳහා ... ලූප සඳහා

let array = [1,2,3,4]

for(let x of array){
  console.log(x);
}

// Output: 1,2,3,4

ලූප අතර

let x = 0

while(x < 5){
  console.log(x)
  x++
}

// Output: 1,2,3,4

කරන්න ... ලූප අතරේ

let x = 0

do{
  console.log(x)
  x++
}while(x < 5)

// Output: 1,2,3,4

4

කාර්ය සාධනය

අද (2019-12-18) මම මගේ මැකෝස් v10.13.6 (හයි සියෙරා), ක්‍රෝම් v 79.0, සෆාරි v13.0.4 සහ ෆයර්ෆොක්ස් v71.0 (බිට් 64) මත පරීක්ෂණ සිදු කරමි - ප්‍රශස්තිකරණය පිළිබඳ නිගමන (සහ ක්ෂුද්‍ර ප්‍රශස්තිකරණය ) ප්‍රතිලාභය කුඩා බැවින් කේතයට එය හඳුන්වා දීම සාමාන්‍යයෙන් වටින්නේ නැත, නමුත් කේත සංකීර්ණතාව වර්ධනය වේ).

  • එය සාම්ප්‍රදායික ලෙස පෙනේ for iසියලුම බ්‍රව්සර්වල වේගවත් කේත ලිවීමට ( Aa ) හොඳ තේරීමක් බව පෙනේ.

  • for-of( දැන්වීම් ) වැනි අනෙක් විසඳුම් සියල්ලම සී කාණ්ඩයේ ඇත . සාමාන්‍යයෙන් Aa ට වඩා 2 - 10 (සහ ඊට වඩා) ගුණයකින් අඩු වේ , නමුත් කුඩා අරා සඳහා එය භාවිතා කිරීම සුදුසුය - කේත පැහැදිලිකම වැඩි කිරීම සඳහා.

  • n( අබ්, බීබී, බී ) අරා දිග සහිත ලූප සමහර විට වේගවත් වේ, සමහර විට එසේ නොවේ. බොහෝ විට සම්පාදකයින් මෙම තත්වය ස්වයංක්‍රීයව හඳුනාගෙන හැඹිලි හඳුන්වා දෙයි. හැඹිලි සහ හැඹිලි රහිත අනුවාදයන් ( Aa, Ba, Bd ) අතර වේග වෙනස ~ 1% ක් පමණ වේ, එබැවින් එය හඳුන්වාදීම na ක්ෂුද්ර ප්රශස්තිකරණය .

  • මෙම i--පසුගිය මාලාවක් මූලද්රව්යය (සිට පුඩුවක් ආරම්භ එහිදී විසඳුම් වැනි ක්රියා, BC බොහෝ විට හේතුව මාර්ගය වන්නේ -) සාමාන්යයෙන් ~ 30% ක් ඉදිරියට විසඳුම් වඩා අඩු වේ CPU මතක හැඹිලිය කම්කරු - ඉදිරියට මතක කියවීම CPU කල ගබඩා සඳහා වැඩි ප්රශස්ත ය).එවැනි විසඳුම් භාවිතා නොකිරීමට නිර්දේශ කෙරේ.

විස්තර

පරීක්ෂණ වලදී අපි අරාව මූලද්‍රව්‍යවල එකතුව ගණනය කරමු. මම කුඩා අරා (මූලද්‍රව්‍ය 10) සහ විශාල අරා (1M මූලද්‍රව්‍ය) සඳහා පරීක්ෂණයක් කර ඒවා කාණ්ඩ තුනකට බෙදා දෙමි:

  • - forපරීක්ෂණ
  • බී - whileපරීක්ෂණ
  • සී - වෙනත් / විකල්ප ක්‍රම

හරස් බ්‍රව්සර් ප්‍රති .ල

පරීක්ෂා කරන ලද සියලුම බ්‍රව්සර් සඳහා ප්‍රති Results ල

රූප විස්තරය මෙහි ඇතුළත් කරන්නබ්‍රව්සර් **

මූලද්රව්ය 10 ක් සමඟ අරාව

Chrome සඳහා ප්‍රති Results ල. ඔබේ යන්ත්‍රය මත ඔබට මෙහි පරීක්ෂණය සිදු කළ හැකිය .

රූප විස්තරය මෙහි ඇතුළත් කරන්න

මූලද්රව්ය 1,000,000 ක් සහිත අරාව

Chrome සඳහා ප්‍රති Results ල. ඔබේ යන්ත්‍රය මත ඔබට මෙහි පරීක්ෂණය සිදු කළ හැකිය

රූප විස්තරය මෙහි ඇතුළත් කරන්න


4

සාරාංශය:

අරාව හරහා නැවත ගමන් කරන විට, අපට බොහෝ විට අවශ්‍ය වන්නේ පහත දැක්වෙන අරමුණු වලින් එකක් සපුරා ගැනීමට ය:

  1. අපට අවශ්‍ය වන්නේ අරාව හරහා නැවත නව අරා එකක් නිර්මාණය කිරීමට ය:

    Array.prototype.map

  2. අපට අරාව හරහා නැවත යෙදීමට අවශ්‍ය වන අතර නව අරාවක් සාදන්න එපා:

    Array.prototype.forEach

    for..of ලූප්

ජාවාස්ක්‍රිප්ට් හි, මෙම අරමුණු දෙකම ඉටු කර ගැනීමට බොහෝ ක්‍රම තිබේ. කෙසේ වෙතත්, සමහර ඒවා අනෙක් ඒවාට වඩා පහසු ය. ජාවාස්ක්‍රිප්ට් හි අරාව නැවත සිදු කිරීම සඳහා බහුලව භාවිතා වන ක්‍රම (වඩාත් පහසු IMO) පහත දැක්වේ.

නව අරාව නිර්මාණය කිරීම: Map

map()යනු Array.prototypeඅරාවෙහි සෑම අංගයක්ම පරිවර්තනය කර නව අරාවක් ලබා දිය හැකි ශ්‍රිතයකි . map()තර්කයක් ලෙස ඇමතුම් ආපසු ගැනීමේ ශ්‍රිතයක් ගෙන පහත පරිදි ක්‍රියා කරයි:

let arr = [1, 2, 3, 4, 5];

let newArr = arr.map((element, index, array) => {
  return element * 2;
})

console.log(arr);
console.log(newArr);

අපි map()තර්කයක් ලෙස සම්මත කර ඇති ඇමතුම සෑම අංගයක් සඳහාම ක්‍රියාත්මක වේ. එවිට අරාව නැවත ලැබෙනුයේ මුල් අරාවට සමාන දිගක් ඇත. මෙම නව අරාවෙහි මූලද්‍රව්‍යය තර්කයක් ලෙස සම්මත කර ඇති ඇමතුම් ආපසු ගැනීමේ ශ්‍රිතය මගින් පරිවර්තනය වේ map().

අතර පැහැදිලි වෙනසක් mapහා තවත් පුඩුවක් යාන්ත්රණයක් වැනි forEachසහ for..ofපුඩුවක් බව ය mapප්රතිලාභ නව අරා සහ කොළ එලෙසම පැරණි අරා (ඔබ සතුව ඒ සඳහා ගසාකෑමට සමග නම් හැර වගේ සිතනsplice ).

තවද, mapශ්‍රිතයේ ඇමතුම දෙවන තර්කයක් ලෙස වත්මන් පුනරාවර්තනයේ දර්ශක අංකය සපයන බව සලකන්න . තවද, තෙවන තර්කය මගින් mapහැඳින්වූ අරාව ලබා දෙයිද? සමහර විට මෙම ගුණාංග ඉතා ප්රයෝජනවත් විය හැකිය.

ලූප් භාවිතා කිරීම forEach

forEachමත පිහිටා ඇති ශ්රිතයක් වේ Array.prototypeතර්කයක් ලෙස callback කාර්යය කාලයක් ගතවේ. එය පසුව අරාවෙහි සෑම අංගයක් සඳහාම මෙම ඇමතුම් ආපසු ගැනීමේ කාර්යය ක්‍රියාත්මක කරයි. map()ශ්‍රිතයට ප්‍රතිවිරුද්ධව , forEach ශ්‍රිතය කිසිවක් ලබා නොදේ ( undefined). උදාහරණයක් වශයෙන්:

let arr = [1, 2, 3, 4, 5];

arr.forEach((element, index, array) => {

  console.log(element * 2);

  if (index === 4) {
    console.log(array)
  }
  // index, and oldArray are provided as 2nd and 3th argument by the callback

})

console.log(arr);

mapශ්‍රිතය සේම , forEachඇමතුම දෙවන තර්කයක් ලෙස වත්මන් පුනරාවර්තනයේ දර්ශක අංකය සපයයි. එසේම, තෙවන තර්කය මගින් forEachහැඳින්වූ අරාව ලබා දෙයිද?

භාවිතා කරමින් මූලද්රව්ය හරහා ලූප for..of

මෙම for..ofලූපය රැසක් (හෝ වෙනත් ඕනෑම iterable වස්තුව) සෑම අංගයක් හරහා වළළු. එය පහත පරිදි ක්රියා කරයි:

let arr = [1, 2, 3, 4, 5];

for(let element of arr) {
  console.log(element * 2);
}

ඉහත උදාහරණයේ දී, elementඅරාව මූලද්‍රව්‍යයක් arrවන අතර එය අපට ලූප කිරීමට අවශ්‍ය අරාව වේ. නම elementඅත්තනෝමතික බව සලකන්න, මෙය අදාළ වන විට අපට 'එල්' හෝ වෙනත් ප්‍රකාශිත යමක් තෝරා ගත හැකිව තිබුණි.

for..inලූපය සමඟ ලූපය පටලවා නොගන්න for..of. for..inඅරාවෙහි ඇති සියළුම ගුණාංග හරහා ලූප් වන අතර for..ofලූපය අරා මූලද්‍රව්‍ය හරහා පමණක් ලූප වනු ඇත. උදාහරණයක් වශයෙන්:

let arr = [1, 2, 3, 4, 5];

arr.foo = 'foo';

for(let element of arr) {
  console.log(element);
}

for(let element in arr) {
  console.log(element);
}

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.