Looping օգտագործելով forEach-ը
forEach
մեթոդը զանգվածի մեթոդ է JavaScript-ում, որը կարող է ֆունկցիա կատարել զանգվածի յուրաքանչյուր տարրի վրա: Այն վերցնում է հետ կանչի ֆունկցիան որպես արգումենտ, որը կատարվում է զանգվածի յուրաքանչյուր տարրի համար։ Հետ կանչելու ֆունկցիան ունի երեք արգումենտ՝ ընթացիկ տարրը, ընթացիկ ինդեքսը և զանգվածը շրջված է:
let numbers = [1, 2, 3, 4, 5]; numbers.forEach((element, index, array) => { console.log(element, index, array); }); // Output: // 1 0 [1, 2, 3, 4, 5] // 2 1 [1, 2, 3, 4, 5] // 3 2 [1, 2, 3, 4, 5] // 4 3 [1, 2, 3, 4, 5] // 5 4 [1, 2, 3, 4, 5]
Այս օրինակում forEach
մեթոդը կանչվում է numbers
զանգվածի վրա, և որպես արգումենտ փոխանցված անանուն ֆունկցիան կատարվում է զանգվածի յուրաքանչյուր տարրի համար։ element
, index
և array
արգումենտները մուտքագրվում են վահանակ, այնպես որ դուք կարող եք տեսնել ընթացիկ տարրը և դրա ինդեքսը զանգվածում, ինչպես նաև ամբողջ զանգվածը, որը շրջվում է:
Looping օգտագործելով քարտեզը
map
մեթոդը զանգվածային մեթոդ է JavaScript-ում, որը կարող է ստեղծել նոր զանգված՝ յուրաքանչյուր տարր վերափոխելով բնօրինակ զանգվածի մեջ: Այն վերցնում է հետ կանչի ֆունկցիան որպես արգումենտ, որը կատարվում է զանգվածի յուրաքանչյուր տարրի համար և յուրաքանչյուր տարրի համար վերադարձնում է նոր արժեք։ Վերադարձված արժեքներն օգտագործվում են նոր զանգված ստեղծելու համար։
let numbers = [1, 2, 3, 4, 5]; let doubledNumbers = numbers.map(function(element) { return element * 2; }); console.log(doubledNumbers); // Output: // [2, 4, 6, 8, 10]
Այս օրինակում map
մեթոդը կանչվում է numbers
զանգվածի վրա, և որպես արգումենտ փոխանցված անանուն ֆունկցիան կատարվում է զանգվածի յուրաքանչյուր տարրի համար։ Ֆունկցիան յուրաքանչյուր տարրի համար վերադարձնում է element * 2
, ինչը նշանակում է, որ numbers
զանգվածի յուրաքանչյուր տարր կրկնապատկվում է: Վերադարձված արժեքներն այնուհետև օգտագործվում են նոր զանգված՝ doubledNumbers
ստեղծելու համար: doubledNumbers
զանգվածը գրանցված է վահանակում, այնպես որ կարող եք տեսնել, որ այն պարունակում է numbers
զանգվածի կրկնապատկված արժեքները:
Տարբերությունը
JavaScript-ում forEach
և map
մեթոդների հիմնական տարբերությունն այն է, թե ինչ են նրանք անում զանգվածի յուրաքանչյուր տարրի արժեքների հետ:
forEach
մեթոդն օգտագործվում է զանգվածի յուրաքանչյուր տարրի համար ֆունկցիա կատարելու համար, բայց այն չի վերադարձնում նոր զանգված: Այն պարզապես թույլ է տալիս կատարել որոշակի գործողություններ յուրաքանչյուր տարրի համար, օրինակ՝ մուտքագրել արժեքները վահանակում կամ ավելացնել արժեքներ մեկ այլ զանգվածում:
Մյուս կողմից, map
մեթոդը ստեղծում է նոր զանգված՝ յուրաքանչյուր տարր վերափոխելով սկզբնական զանգվածում: Այն ընդունում է հետ կանչի ֆունկցիան որպես արգումենտ և յուրաքանչյուր տարրի համար վերադարձնում է նոր արժեք, որն օգտագործվում է նոր զանգված ստեղծելու համար։ Նոր զանգվածը պարունակում է փոխակերպված արժեքները, իսկ սկզբնական զանգվածը մնում է անփոփոխ։
Այսպիսով, թեև forEach
-ը և map
-ը թույլ են տալիս շրջել զանգվածի տարրերի վրա, forEach
մեթոդն ավելի շատ կենտրոնացած է յուրաքանչյուր տարրի համար գործողություններ կատարելու վրա, մինչդեռ map
մեթոդն ավելի շատ կենտրոնացած է արժեքների փոխակերպման և նոր զանգված ստեղծելու վրա:
համար … ընդդեմ …-ի համար
«for…in» հանգույցն օգտագործվում է օբյեկտների հատկությունների միջով պտտելու համար, մինչդեռ «for…of» օղակը օգտագործվում է կրկնվող տարրերի միջով պտտելու համար, ինչպիսիք են զանգվածները, տողերը, քարտեզները և հավաքածուները:
Շարահյուսություն:
for (let variable in object) { // code to be executed } for (let variable of iterable) { // code to be executed }
Ահա տարբերությունը.
- «for…in» հանգույցը օգտագործվում է օբյեկտի հատկությունների վրա պտտելու համար և վերադարձնում է բանալիները, այլ ոչ թե օբյեկտի արժեքները:
- «for…of» հանգույցն օգտագործվում է կրկնվող արժեքների վրա պտտելու համար և վերադարձնում է օբյեկտի արժեքները:
Օրինակ:
let array = [1, 2, 3, 4, 5]; for (const value in array) { console.log(value); } // Output: 0 1 2 3 4 for (const value of array) { console.log(value); } // Output: 1 2 3 4 5
Այսպիսով, մի խոսքով, եթե ցանկանում եք շրջել օբյեկտի հատկությունների միջոցով, օգտագործեք «for…in» և եթե ցանկանում եք պտտել արժեքների միջով կրկնվողի մեջ, օգտագործեք «for…of»:
Այսպիսով, ե՞րբ ենք մենք սովորաբար օգտագործում for in, for of, forEach կամ քարտեզի համար:
Դա կախված է իրավիճակից, բայց ընդհանուր առմամբ.
for...in
. Օգտագործեք սա, երբ ցանկանում եք պտտել օբյեկտի հատկությունները, ներառյալ հատկությունները, որոնք կարող են ավելացվել օբյեկտի նախատիպին:for...of
. Օգտագործեք սա, երբ ցանկանում եք պտտել կրկնվող տարրերի միջով, ինչպիսիք են զանգվածը, տողը, քարտեզը կամ բազմությունը: Այն ավելի հակիրճ է, քանfor...in
հանգույցը, ինչպես նաև չի ներառում որևէ հատկություն նախատիպի շղթայից:Array.prototype.forEach()
. Օգտագործեք սա, երբ ցանկանում եք գործողություն կատարել զանգվածի յուրաքանչյուր տարրի վրա, բայց ձեզ ոչինչ պետք չէ վերադարձնել:Array.prototype.map()
. Օգտագործեք սա, երբ ցանկանում եք ստեղծել նոր զանգված՝ փոխակերպելով գոյություն ունեցող զանգվածի յուրաքանչյուր տարր: Այն վերադարձնում է նոր զանգվածը և հաճախ օգտագործվում է զանգվածից տվյալները նոր տվյալների կառուցվածքի մեջ հանելու համար:
Այսպիսով, դուք ընտրում եք այն մեկը, որը լավագույնս համապատասխանում է ձեր օգտագործման գործին: Եթե ձեզ պարզապես անհրաժեշտ է պտտել կրկնվողի միջով և կատարել որոշ գործողություններ նրա տարրերի վրա, լավ կլինի՝ կամ for...of
կամ Array.prototype.forEach()
: Եթե Ձեզ անհրաժեշտ է գոյություն ունեցողից նոր զանգված ստեղծել, Array.prototype.map()
-ը լավագույն ընտրությունն է:
Որոշ հարցեր ավագ Frontend ինժեների համար Looping-ի մասին
Ահա մի քանի տեխնիկական հարցեր, որոնց կարող է հանդիպել ավագ ինժեները for in
, for of
, forEach
և map
-ի օգտագործման վերաբերյալ JavaScript-ում.
- Ո՞րն է տարբերությունը
for in
ևfor of
հանգույցների միջև JavaScript-ում: - Ինչպե՞ս կարող եք դուրս գալ
forEach
հանգույցից JavaScript-ում: - Կարող եք օգտագործել
continue
forEach
հանգույցով JavaScript-ում: Ի՞նչ կասեքbreak
-ի մասին: - Ե՞րբ պետք է օգտագործեք
map
ֆունկցիան JavaScript-ումforEach
հանգույցի վրա: - Ինչպե՞ս եք մուտք գործում JavaScript-ում
map
ֆունկցիայի ինդեքսը և արժեքը: - Կարող եք օգտագործել
map
-ը JavaScript-ում զանգվածը տեղում փոփոխելու համար: - Որո՞նք են JavaScript-ում
map
ընդդեմforEach
-ի օգտագործման հետևանքները: - Կարող եք օգտագործել
map
-ը JavaScript-ում զանգվածի փոխարեն նոր օբյեկտ վերադարձնելու համար: - Ո՞րն է տարբերությունը
map
-ի ևpush
հայտարարությամբfor
հանգույց օգտագործելու միջև՝ JavaScript-ում նոր զանգված ստեղծելու համար: - Ինչպե՞ս կարող եք կառավարել ասինխրոն գործողությունները JavaScript-ում
map
ֆունկցիայի շրջանակներում:
Այս հարցերը կարող են օգնել գնահատել առաջնակարգ ինժեների ըմբռնումն ու հմտությունները JavaScript-ում առկա տարբեր օղակների և կրկնությունների մեթոդների կիրառման հարցում:
Թիվ 1-ին, 4-րդ, 5-րդ և 8-րդ հարցին տրվել է պատասխան վերը նշված քննարկման ժամանակ:
Հարց թիվ 2.
JavaScript-ում forEach
հանգույցից դուրս գալու համար կարող եք օգտագործել return
հայտարարությունը forEach
հետադարձ զանգի ֆունկցիայի ներսում: Այնուամենայնիվ, սա միայն դադարեցնում է ընթացիկ կրկնության կատարումը և շարունակվում է հաջորդ կրկնությամբ:
Եթե ցանկանում եք ամբողջությամբ դուրս գալ օղակից և դադարեցնել կրկնման գործընթացը, կարող եք օգտագործել դրոշակ փոփոխական՝ հետևելու, թե արդյոք օղակը պետք է շարունակվի: Հետ կանչելու գործառույթում կարող եք ստուգել դրոշի արժեքը, և եթե այն սահմանված է false
, օգտագործեք return
կրկնությունը դադարեցնելու համար:
let array = [1, 2, 3, 4]; let shouldContinue = true; array.forEach(function(value) { if (!shouldContinue) return; console.log(value); if (value === 3) { shouldContinue = false; } }); // Output: 1 2 3
Այս օրինակում forEach
հանգույցը կդադարի, երբ արժեքը հավասար լինի 3
-ին, քանի որ shouldContinue
-ը սահմանվել է false
:
Հարց թիվ 3.
Ոչ, դուք չեք կարող օգտագործել continue
-ը կամ break
-ն ուղղակիորեն forEach
հանգույցով JavaScript-ում, քանի որ forEach
-ը չունի ավանդական հանգույց կառուցվածք՝ կառավարման հոսքով, որը թույլ է տալիս օգտագործել այս հայտարարությունները:
Եթե Ձեզ անհրաժեշտ է continue
կամ break
ֆունկցիոնալությունը, կարող եք օգտագործել դրոշակ փոփոխական՝ հետևելու հանգույցի կատարմանը, որը նման է հանգույցից դուրս գալուն, ինչպես նկարագրված է նախորդ պատասխանում:
Ահա մի օրինակ՝ օգտագործելով դրոշակ փոփոխական՝ continue
հայտարարությունը նմանակելու համար.
let array = [1, 2, 3, 4]; array.forEach(function(value) { if (value % 2 === 0) return; console.log(value); }); // Output: 1 3
Այս օրինակում forEach
հանգույցը շարունակում է հաջորդ կրկնությունը, եթե արժեքը հավասար է՝ արդյունավետ կերպով նմանակելով continue
հայտարարությունը:
Հարց թիվ 6.
Դուք չեք կարող օգտագործել map
-ը՝ JavaScript-ում զանգվածը տեղում փոփոխելու համար: map
-ը վերադարձնում է նոր զանգված, որը պարունակում է սկզբնական զանգվածի յուրաքանչյուր տարրի վրա տրամադրված ֆունկցիայի կանչման արդյունքները: Բնօրինակ զանգվածը փոփոխված չէ:
Հարց թիվ 7.
JavaScript-ում map
ընդդեմ forEach
-ի օգտագործման արդյունավետությունը կարող է կախված լինել կոնկրետ օգտագործման դեպքից: Ընդհանուր առմամբ, map
-ն ավելի արագ է, քան forEach
-ը, քանի որ map
-ը վերադարձնում է նոր զանգված, մինչդեռ forEach
-ը փոփոխում է զանգվածը տեղում: Սա նշանակում է, որ map
-ն օգտագործելիս JavaScript շարժիչը կարող է մեկ անգամ հիշողություն հատկացնել նոր զանգվածին, մինչդեռ forEach
-ի դեպքում շարժիչը պետք է բազմիցս փոփոխի առկա զանգվածը, ինչը կարող է ավելի դանդաղ լինել:
Այնուամենայնիվ, կարևոր է նշել, որ կատարողականի տարբերությունը սովորաբար աննշան է փոքր զանգվածների համար, և կատարողականի տարբերությունը կախված կլինի մշակվող զանգվածի չափից և բարդությունից:
Ընդհանուր առմամբ, խորհուրդ է տրվում ընտրել շրջադարձային մեթոդը՝ հիմնվելով ցանկալի արդյունքի վրա, այլ ոչ թե կատարողականի նկատառումների վրա: Եթե Ձեզ անհրաժեշտ է փոփոխել զանգվածը տեղում, օգտագործեք forEach
: Եթե Ձեզ անհրաժեշտ է ստեղծել նոր զանգված, օգտագործեք map
: Բացի այդ, դուք կարող եք օգտագործել forEach
-ը կողմնակի էֆեկտների համար, ինչպիսիք են հաշվիչը գրանցելը կամ թարմացնելը, քանի որ forEach
-ը նոր արժեք չի վերադարձնում:
Հարց թիվ 9.
Ե՛վ map
, և՛ for
հանգույցը՝ push
հայտարարությամբ, կարող են օգտագործվել JavaScript-ում նոր զանգված ստեղծելու համար, սակայն դրանք այլ կերպ են աշխատում:
map
-ը ավելի բարձր կարգի ֆունկցիա է, որը վերադարձնում է նոր զանգված՝ կիրառելով տրամադրված ֆունկցիա սկզբնական զանգվածի յուրաքանչյուր տարրի վրա: map
-ն ավելի հակիրճ է և ավելի հեշտ ընթեռնելի, քան for
հանգույցը push
հայտարարությամբ, քանի որ այն ավելի հստակ է արտահայտում նոր զանգված ստեղծելու մտադրությունը:
Ահա map
-ի օգտագործման օրինակ՝ նոր զանգված ստեղծելու համար.
let array = [1, 2, 3, 4]; let doubledArray = array.map(x => x * 2); console.log(doubledArray); // Output: [2, 4, 6, 8]
for
հանգույցը push
հայտարարությամբ ավելի ցածր մակարդակի մոտեցում է նոր զանգված ստեղծելու համար: for
հանգույցը կրկնվում է սկզբնական զանգվածի տարրերի վրա, իսկ push
հայտարարությունը տրամադրված ֆունկցիայի արդյունքները մղում է նոր զանգված:
Ահա for
հանգույց օգտագործելու օրինակ՝ push
հայտարարությամբ՝ նոր զանգված ստեղծելու համար.
let array = [1, 2, 3, 4]; let doubledArray = []; for (let i = 0; i < array.length; i++) { doubledArray.push(array[i] * 2); } console.log(doubledArray); // Output: [2, 4, 6, 8]
Կատարման առումով, for
հանգույցը push
հայտարարությամբ, ընդհանուր առմամբ, ավելի դանդաղ է, քան map
-ը, քանի որ այն պետք է հիշողություն հատկացնի նոր զանգվածի համար և յուրաքանչյուր տարր մեկ առ մեկ մղի նոր զանգված: Այնուամենայնիվ, կատարողականի տարբերությունը սովորաբար աննշան է փոքր զանգվածների համար, և map
-ի և for
հանգույցի միջև ընտրությունը push
հայտարարությամբ պետք է հիմնված լինի կոդի ընթերցանության և պահպանման, այլ ոչ թե կատարողականի վրա:
Ծանոթագրություններ
Համակարգչային ծրագրավորման մեջ ավելի բարձր կարգի ֆունկցիան այն ֆունկցիան է, որն ընդունում է մեկ կամ մի քանի ֆունկցիա որպես արգումենտ կամ վերադարձնում է ֆունկցիա որպես արդյունք: Ավելի բարձր կարգի ֆունկցիաները հնարավորություն են տալիս վերացական և վերօգտագործել վարքագծի ընդհանուր օրինաչափությունները և ֆունկցիոնալ ծրագրավորման հիմնական հատկանիշն են:
Ավելի բարձր կարգի գործառույթները թույլ են տալիս գրել ավելի արտահայտիչ և բաղադրելի կոդ՝ ավելի պարզ գործառույթները ավելի բարդ գործառույթների մեջ համատեղելով: Նրանք կարող են օգնել ձեր կոդը դարձնել ավելի հակիրճ, ընթեռնելի և պահպանելի:
Մյուս կողմից, Ավելի ցածր մակարդակի մոտեցումը վերաբերում է ծածկագրին, որը գրված է ավելի պարզունակ, ընթացակարգային կամ հրամայական ոճով: Ստորին մակարդակի մոտեցումները հաճախ հիմնվում են փոփոխականների և կառավարման կառուցվածքների ուղղակի մանիպուլյացիայի վրա, ինչպիսիք են for
հանգույցները, if
հայտարարությունները և while
հանգույցները: Ավելի ցածր մակարդակի մոտեցումները կարող են լինել ավելի արագ և արդյունավետ, բայց դրանք կարող են նաև լինել ավելի խոսուն և ավելի քիչ արտահայտիչ, քան ավելի բարձր կարգի գործառույթները:
Ավելի բարձր կարգի ֆունկցիայի և ավելի ցածր մակարդակի մոտեցման միջև ընտրությունը կախված է օգտագործման կոնկրետ դեպքից, կոդի պահանջներից և ծրագրավորողի նախասիրություններից: Ավելի բարձր կարգի գործառույթները հաճախ նախընտրելի են իրենց արտահայտչականության և ընթեռնելիության համար, մինչդեռ ավելի ցածր մակարդակի մոտեցումները նախընտրելի են իրենց կատարողականության և արդյունավետության համար:
Հարց թիվ 10.
JavaScript-ում map
ֆունկցիայի շրջանակներում ասինխրոն գործողությունները կարող են իրականացվել՝ վերադարձնելով խոստումը քարտեզագրման ֆունկցիայից և օգտագործելով Promise.all
՝ սպասելու բոլոր խոստումների լուծմանը:
Ահա ասինխրոն գործողություններ վարելու համար map
-ի օգտագործման օրինակ.
let urls = [ 'https://api.example.com/data1', 'https://api.example.com/data2', 'https://api.example.com/data3' ]; let fetchData = url => { return fetch(url) .then(response => response.json()) .catch(error => console.error(error)); }; let mappedData = urls.map(url => fetchData(url)); Promise.all(mappedData) .then(data => { console.log(data); }) .catch(error => console.error(error));
Այս օրինակում fetchData
ֆունկցիան վերադարձնում է խոստում, որը լուծում է API-ի տվյալների հետ: map
ֆունկցիան օգտագործվում է fetchData
ֆունկցիան urls
զանգվածի յուրաքանչյուր URL-ի վրա կիրառելու համար, իսկ Promise.all
՝ սպասելու բոլոր խոստումների լուծմանը: Երբ բոլոր խոստումները լուծվեն, ստացված տվյալները մուտքագրվում են վահանակ:
Նկատի ունեցեք, որ map
-ը գործում է համաժամանակյա, այնպես որ, եթե Ձեզ անհրաժեշտ է ասինխրոն գործողություններ կատարել map
-ի սահմաններում, դուք պետք է օգտագործեք խոստումներ կամ հետ կանչեր՝ ասինխրոն վարքագիծը կարգավորելու համար: