Անհրաժեշտ է ստեղծել ֆունկցիա, որը որպես արգումենտ կստանա բազմաչափ զանգված և կվերադարձնի նոր միաչափ զանգված՝ բաղկացած բազմաչափ զանգվածի բոլոր ներդրվածության մակարդակներում գտնվող էլեմենտներից:
Նախ բերեք վերհիշենք թե ինչ են իրենցից ներկայացնում բազմաչափ զանգվածները։ JavaScript-ում զանգվածի էլեմենտները կարող են լինել ցանկացած տիպի՝ թվային, տողային, բուլյան և այլն։ Բնականաբար էլեմենտները կարող են լինել նաև բարդ օբյեկտային տիպին պատկանող զանգվածներից, և այս դեպքում մենք կունենանք զանգվածների զանգված՝ ինչպես ընդունված է ասել երկչափ զանգված կամ մատրիցա։ Ոչինչ չի խանգարում, որպեսզի զանգվածի էլեմենտ հանդիսացող զանգվածը նույնպես բաղկացած լինի զանգվածներից, այս դեպքում մենք կունենանք եռաչափ զանգված և այդպես շարունակ:
Խնդիրը կայանում է նրանում, որպեսզի մենք ստեղծենք այնպիսի ֆունկցիա, որը որպես արգումենտ կստանա երկչափ, եռաչափ, կամ ուղղակի ասենք բազմաչափ զանգված, և կվերադարձնի նոր, սովորական միաչափ զանգված, որը բաղկացած կլինի բազմաչափ զանգվածի բոլոր ներդրվածության մակարդակներում գտնվող էլեմենտներից։ Խնդրի լուծման տարբերակներն իհարկե շատ են, մենք կդիտարկենք երկու տարբերակ՝ ռեկուրսիայի կամ զանգվածի պրոտոտիպում ներդրված flat մեթոդի օգնությամբ։ Եվ այսպես՝ առաջին տարբերակը՝ ռեկուրսիայի օգնությամբ․
function flat(arr) {
let res = [];
arr.forEach((item) => {
if (Array.isArray(item)) {
res = res.concat(flat(item));
} else {
res.push(item);
}
});
return res;
}
Այժմ քայլ առ քայլ տեսնենք թե ինչպես է ֆունկցիան աշխատում։ Ֆունկցիան պետք է վերադարձնի նոր զանգված, և մեզ անհրաժեշտ է հայտարարել res նախնական դատարկ զանգվածը։ Ապա արգումենտով ստացված arr բազմաչափ զանգվածի վրա կանչում ենք զանգվածների forEach մեթոդը։ Անցնելով զանգվածի յուրաքանչյուր էլեմենտի վրայով, Array.isArray մեթոդով ստուգում ենք այն իրենից զանգված է ներկայացնում թե ոչ։ Եթե այն նորից զանգված է, ապա նրա վրա կրկին կանչում ենք flat ֆունկցիան, եթե ոչ՝ ֆունկցիայի մարմնում ստեղծված res զանգվածի մեջ վերջից ավելացնում ենք այդ էլեմենտը։ Ֆունկցիան վերադարձնում է res զանգվածը, որն էլ արդեն միաչափ զանգված է՝ բաղկացած arr բազմաչափ զանգվածի բոլոր ներդրվածության մակարդակներում գտնվող էլեմենտներից: Այժմ կանչենք ֆունկցիան, և նրան տանք որևէ բազմաչափ զանգված, տեսնելու համար թե արդյոք այն ճիշտ է աշխատում․
flat([1, 2, 3, [4, 5, 6, [7, 8, 9]]]); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
Դիտարկենք երկրորդ տարբերակը։ Զանգվածի պրոտոտիպի մեջ կա ներդրված flat մեթոդը։ Սինթաքսը հետևյալն է՝
const newArray = arr.flat(depth)
։
Մեթոդը վերադարձնում է newArray նոր զանգվածը, որտեղ arr զանգվածի մեջ գտնվող «ենթազանգվածները» բարձրացվում են մինչև depth արգումենտում նշված մակարդակին։ depth պարամետրը ոչ պարտադիր (օպցիոնալ) է։ Եթե մենք այնտեղ ոչինչ չգրենք, ապա որպես նախնական արժեք այն կընդունի 1-ը։ Որպեսզի մեթոդը անկախ զանգվածի ներդրվածության մակարդակից (երկչափ, եռաչափ և այլն), միշտ վերադարձնի միաչափ զանգված, կարելի է depth պարամետրին տալ Infinity արժեքը։ Օրինակ՝
[1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]].flat(Infinity); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Փոփոխելով depth արգումենտի արժեքը, մենք կարող ենք կարգավորել մեթոդի աշխատանքը, ստիպելով նրան վերադարձնել նոր զանգված մինչև այնքան ներդրվածության մակարդակով, ինչքան որ մեզ անհրաժեշտ է: