Foreach js kwa safu na mikusanyiko. JQuery - Kupitia safu, kitu na vipengele. Kutumia mbinu kurudia juu ya safu halisi

Njia ya forEach() hutekeleza kazi iliyotolewa mara moja kwa kila kipengele cha safu.

Chanzo cha mfano huu wa mwingiliano huhifadhiwa kwenye hazina ya GitHub. Iwapo ungependa kuchangia mradi wa mifano shirikishi, tafadhali unganisha https://github.com/mdn/interactive-examples na ututumie ombi la kuvuta.

Syntax arr .forEach(callback(currentValue [, index [, array]]) [, thisArg ]) Vigezo vya urejeshaji wa kazi Kazi ya kutekeleza kwenye kila kipengele. Inakubali kati ya hoja moja na tatu: Thamani ya sasa Kipengele cha sasa kinachakatwa katika safu. index Hiari Fahirisi ya sasaThamani katika safu. safu ya Hiari Safu yaEach() iliitishwa. thisArg Optional Value kutumia kama hii wakati wa kutekeleza callback . Maelezo ya thamani ya kurejesha

forEach() huita kitendakazi kilichotolewa mara moja kwa kila kipengele katika safu katika mpangilio wa kupanda. Haijaombwa kwa sifa za faharasa ambazo zimefutwa au ambazo hazijaanzishwa. (Kwa safu chache, .)

callback inaalikwa kwa hoja tatu:

  • thamani ya kipengele
  • index ya kipengele
  • kitu cha Array kinachopitiwa
  • Ikiwa kigezo thisArg kimetolewa kwa forEach() , kitatumika kama callback"s thamani hii. Thamani ya thisArg hatimaye inaonekana kwa kurudisha nyuma hubainishwa kulingana na kanuni za kawaida za kubainisha hii inayoonekana na chaguo la kukokotoa .

    Masafa ya vipengele vilivyochakatwa na forEach() yamewekwa kabla ya ombi la kwanza la callback . Vipengele ambavyo vimeambatishwa kwenye safu baada ya simu kwa forEach() kuanza havitatembelewa kwa kurudisha nyuma . Iwapo vipengele vilivyopo vya mkusanyiko vitabadilishwa au kufutwa, thamani yake kama inavyopitishwa kwa urejeshaji simu itakuwa thamani wakati wa kutembeleaEach(); vipengele vinavyofutwa kabla ya kutembelewa havitembelewi. Ikiwa vipengele ambavyo tayari vimetembelewa vitaondolewa (k.m. kutumia shift()) wakati wa kurudia, vipengee vya baadaye vitarukwa. (Angalia mfano huu hapa chini.)

    forEach() hutekeleza kitendakazi cha kurudi nyuma mara moja kwa kila kipengele cha safu; tofauti na map() au reduce() huwa inarudisha thamani ambayo haijafafanuliwa na haiwezi kufungwa. Kesi ya kawaida ya utumiaji ni kutekeleza athari mwishoni mwa mnyororo.

    forEach() haibadilishi safu ambayo inaitwa. (Hata hivyo, kurudi nyuma kunaweza kufanya hivyo)

    Hakuna njia ya kusimamisha au kuvunja kitanzi cha forEach() isipokuwa kwa kutupa ubaguzi. Ikiwa unahitaji tabia kama hiyo, forEach() njia ni zana isiyo sahihi.

    Kukomesha mapema kunaweza kukamilishwa na:

    Mbinu za safu: every() , some() , find() , na findIndex() jaribu vipengee vya safu kwa kihusishi kinachorudisha thamani ya ukweli ili kubaini ikiwa marudio zaidi yanahitajika.

    Mifano Hakuna utendakazi wa thamani ambazo hazijaanzishwa ​​(safu chache) const arraySparse = let numCallbackRuns = 0 arraySparse.forEach(function(element)( console.log(element) numCallbackRuns++ )) console.log("numCallbackRuns: ", numCallbackRuns: ", numCallbackRuns: ", numCallback 1 / / 3 // 7 // numCallbackRuns: 3 // maoni: unavyoweza kuona thamani inayokosekana kati ya 3 na 7 "haikuomba chaguo la kurudisha nyuma. Kubadilisha kitanzi kuwa forEach const items = ["item1", "item2 ", "item3"] const copy = // kabla ya (let i = 0; i< items.length; i++) { copy.push(items[i]) } // after items.forEach(function(item){ copy.push(item) }) Printing the contents of an array

    Kumbuka: Ili kuonyesha maudhui ya mkusanyiko katika kiweko, unaweza kutumia console.table() , ambayo huchapisha toleo lililoumbizwa la safu.

    Mfano ufuatao unaonyesha mbinu mbadala, kwa kutumia forEach() .

    Nambari ifuatayo inaweka mstari kwa kila kipengele katika safu:

    Kazi logArrayElements(element, index, array) ( console.log("a[" + index + "] = " + element) ) // Ona kwamba fahirisi ya 2 imerukwa, kwa kuwa hakuna kipengee // nafasi hiyo kwenye safu... .forEach(logArrayElements) // kumbukumbu: // a = 2 // a = 5 // a = 9

    Kwa kutumia hiiArg

    Mfano ufuatao (uliotungwa) husasisha mali ya kitu kutoka kwa kila ingizo kwenye safu:

    Kihesabu cha Kazi() ( this.sum = 0 this.count = 0 ) Counter.prototype.add = function(array) ( array.forEach(function(entry) ( this.sum += entry ++this.count ), hii ) // ^---- Kumbuka ) const obj = new Counter() obj.add() obj.count // 3 obj.sum // 16

    Kwa kuwa kigezo hiki cha thisArg (hii) kimetolewa kwa forEach() , kinapitishwa kurudisha nyuma kila wakati kinapoombwa. Kipigio simu kinakitumia kama thamani yake hii.

    Kitendaji cha kunakili kipengee

    Nambari ifuatayo huunda nakala ya kitu fulani.

    Kuna njia tofauti za kuunda nakala ya kitu. Ifuatayo ni njia moja tu na inawasilishwa ili kueleza jinsi Array.prototype.forEach() inavyofanya kazi kwa kutumia ECMAScript 5 Object.* utendaji wa kipengele wa meta.

    Nakala ya utendakazi(obj) ( const copy = Object.create(Object.getPrototypeOf(obj)) const propNames = Object.getOwnPropertyNames(obj) propNames.forEach(function(jina) ( const desc = Object.getOwnProperty) Names .defineProperty(copy, name, desc) )) return copy ) const obj1 = ( a: 1, b: 2 ) const obj2 = copy(obj1) // obj2 inaonekana kama obj1 sasa

    Ikiwa safu itarekebishwa wakati wa kurudia, vipengele vingine vinaweza kurukwa.

    Mfano ufuatao umeweka kumbukumbu "moja" , "mbili" , "nne" .

    Wakati ingizo lililo na thamani "two" is reached, the first entry of the whole array is shifted off-resulting in all remaining entries moving up one position. Because element "four" is now at an earlier position in the array, "three" will be skipped.!}

    forEach() haifanyi nakala ya safu kabla ya kurudia.

    Acha maneno = ["moja", "mbili", "tatu", "nne"] maneno.forEach(function(neno) ( console.log(word) if (neno === "mbili") (words.shift( ) ) )) // moja // mbili // nne

    Sawazisha safu

    Mfano ufuatao ni hapa tu kwa madhumuni ya kujifunza. Ikiwa ungependa kusawazisha safu kwa kutumia mbinu zilizojengewa ndani unaweza kutumia Array.prototype.flat() (ambayo inatarajiwa kuwa sehemu ya ES2019, na tayari inatekelezwa katika baadhi ya vivinjari).

    /** * Flattens kupita safu katika safu moja dimensional * * @params (safu) arr * @returns (safu) */ kazi flatten(arr) ( const result = arr.forEach((i) => ( if (Array. isArray(i)) ( result.push(...flatten(i)) ) else ( result.push(i) )) return result ) // Usage const problem = , 8, 9]] flatten(problem) //

    Kumbuka kuhusu kutumia Ahadi au vitendaji vya ulandanishi wacha ukadiriaji = let sum = 0 let sumFunction = kazi ya kusawazisha (a, b) ( rudisha + b ) ratings.forEach(async function(rating) ( sum = await sumFunction(jumla, rating) ) ) console.log(jumla) // Pato linalotarajiwa: 14 // Pato halisi: 0 Vipimo Maoni ya Hali ya Uainishaji
    Rasimu ya Hivi Punde ya ECMAScript (ECMA-262)
    Rasimu
    ECMAScript 2015 (Toleo la 6, ECMA-262)
    Ufafanuzi wa "Array.prototype.forEach" katika vipimo hivyo.
    Kawaida
    ECMAScript 5.1 (ECMA-262)
    Ufafanuzi wa "Array.prototype.forEach" katika vipimo hivyo.
    Kawaida Ufafanuzi wa awali. Inatekelezwa katika JavaScript 1.6.
    Utangamano wa kivinjari

    Jedwali la uoanifu katika ukurasa huu limetolewa kutoka kwa data iliyopangwa. Iwapo ungependa kuchangia data, tafadhali angalia https://github.com/mdn/browser-compat-data na ututumie ombi la kuvuta.

    Sasisha data ya uoanifu kwenye GitHub

    Seva ya Simu ya Kompyuta ya mezani Chrome Edge Firefox Internet Explorer Opera Safari Android webview Chrome for Android Firefox for Android Opera for Android Safari on iOS Samsung Internet Node.jskwa kila
    Usaidizi kamili wa Chrome 1Msaada kamili wa Edge 12Msaada kamili wa Firefox 1.5Msaada kamili wa IE 9Msaada kamili wa Opera NdioMsaada kamili wa Safari 3WebView Android Usaidizi kamili ≤37Usaidizi kamili wa Chrome Android 18Msaada kamili wa Firefox Android 4Opera Android Msaada kamili NdiyoUsaidizi kamili wa Safari iOS 1Samsung Internet Android Msaada Kamili 1.0nodejs Msaada kamili Ndiyo

    Sasisho la mwisho: 03/26/2018

    Kitu cha Mpangilio kinawakilisha safu na hutoa idadi ya sifa na mbinu ambazo tunaweza kuendesha safu.

    Kuanzisha safu

    Unaweza kuunda safu tupu kwa kutumia mabano ya mraba au mjenzi wa Array:

    Var watumiaji = safu mpya (); var people =; console.log(watumiaji); // Array console.log(watu); //Safu

    Unaweza mara moja kuanzisha safu na idadi fulani ya vitu:

    Var users = new Array("Tom", "Bill", "Alice"); var people = ["Sam", "John", "Kate"]; console.log(watumiaji); // ["Tom", "Bill", "Alice"] console.log(people); // ["Sam", "John", "Kate"]

    Unaweza kufafanua safu na kuongeza vipengee vipya kwake unapoendelea:

    Var watumiaji = safu mpya (); watumiaji = "Tom"; watumiaji = "Kate"; console.log(watumiaji); // "Tom" console.log (watumiaji); // haijafafanuliwa

    Haijalishi kwamba kwa chaguo-msingi safu imeundwa kwa urefu wa sifuri. Kwa kutumia faharasa, tunaweza kubadilisha kipengele kimoja au kingine katika safu katika faharasa mahususi.

    urefu

    Ili kujua urefu wa safu, tumia mali ya urefu:

    Var matunda = safu mpya (); matunda = "apples"; matunda = "pears"; matunda = "plum"; document.write("Katika safu ya matunda " + fruit.length +" kipengele:
    "); kwa (var i=0; i< fruit.length; i++) document.write(fruit[i] + "
    ");

    Kwa kweli, urefu wa safu itakuwa index ya kipengele cha mwisho pamoja na moja. Kwa mfano:

    Var watumiaji = safu mpya (); // kuna vipengele 0 katika safu watumiaji = "Tom"; watumiaji = "Kate"; watumiaji = "Sam"; kwa(var i=0; i 0) (matokeo = kweli;) rudisha matokeo; ); var kupita = nambari. kila (hali); hati.andika(iliyopitishwa); // uongo

    Kila() njia hupitishwa kazi inayowakilisha hali kama kigezo. Kazi hii inachukua vigezo vitatu:

    Hali ya utendakazi(thamani, faharasa, safu) ( )

    Kigezo cha thamani kinawakilisha kipengele cha safu cha sasa kinachorudiwa, kigezo cha faharasa kinawakilisha faharasa ya kipengele hicho, na kigezo cha safu hupitisha marejeleo kwa safu.

    Katika chaguo hili la kukokotoa tunaweza kuangalia thamani ya kipengele kilichopitishwa kwa kufuata hali fulani. Kwa mfano, katika mfano huu tunaangalia kila kipengele cha safu ili kuona ikiwa ni kubwa kuliko sifuri. Ikiwa ni kubwa zaidi, basi tunarudisha thamani true , yaani, kipengele kinakidhi masharti. Ikiwa chini, basi urejee uongo - kipengele haifikii hali hiyo.

    Matokeo yake, wakati nambari. kila (hali) njia inaitwa, inarudia kupitia vipengele vyote vya safu ya nambari na kuwapitisha moja kwa moja kwa kazi ya hali. Ikiwa chaguo hili la kukokotoa litarudi kuwa kweli kwa vipengele vyote, basi kila () njia inarudi kuwa kweli. Ikiwa angalau kipengee kimoja hakilingani na hali, basi kila () njia inarudi false .

    baadhi ()

    Some() njia ni sawa na kila() njia, inakagua tu ikiwa angalau kipengee kimoja kinalingana na hali. Na katika kesi hii, some() njia inarudi true . Ikiwa hakuna vipengele vinavyolingana na hali katika safu, uongo hurejeshwa:

    Nambari za Var = [ 1, -12, 8, -4, 25, 42]; hali ya kazi(thamani, faharisi, safu) ( var tokeo = uongo; ikiwa (thamani === 8) (matokeo = kweli; ) matokeo ya kurudisha; ); var kupita = namba.some(hali); // kweli

    chujio ()

    Kichujio() mbinu, kama some() na every() , inakubali kitendakazi cha hali. Lakini wakati huo huo inarudisha safu ya vitu hivyo ambavyo vinakidhi hali hii:

    Nambari za Var = [ 1, -12, 8, -4, 25, 42]; hali ya utendaji kazi(thamani, faharisi, safu) ( var tokeo = uongo; ikiwa (thamani > 0) ( matokeo = kweli; ) rudisha matokeo; ); var filteredNumbers = numbers.filter(condition); kwa (var i=0; i< filteredNumbers.length; i++) document.write(filteredNumbers[i] + "
    ");

    Toleo la kivinjari:

    1 8 25 42

    forEach() na ramani()

    Njia za forEach() na map() zinarudia vipengele na kufanya shughuli fulani juu yake. Kwa mfano, kuhesabu miraba ya nambari katika safu, unaweza kutumia nambari ifuatayo:

    Nambari za Var = [1, 2, 3, 4, 5, 6]; kwa(var i = 0; i= 0; --index) ( console.log(a); )
    Walakini, katika injini za kisasa za JavaScript michezo kama hiyo ya uboreshaji kawaida haimaanishi chochote.

    3. Matumizi Sahihi ya kwa...katika Kitanzi Ikiwa unashauriwa kutumia kwa...katika kitanzi, kumbuka kuwa kurudia safu sio kile kinachokusudiwa. Kinyume na dhana potofu ya kawaida, for...in loop hairudii tena juu ya fahirisi za safu, bali kupitia sifa zinazohesabika za kitu.

    Walakini, katika hali zingine, kama vile kurudia juu ya safu chache, kwa...in inaweza kuwa muhimu, mradi tu uchukue tahadhari, kama inavyoonyeshwa kwenye mfano hapa chini:

    // a - safu ndogo var a =; a = "a"; a = "b"; a = "c"; kwa (var key in a) ( ikiwa (a.hasOwnProperty(key) && /^0$|^\d*$/.test(key) && key