Sparse Arrays JavaScript-ում (բացված զանգվածներ)
avaScript-ում զանգվածներն, ինչպես գիտենք, կարող են պահել ցանկացած տեսակ արժեքներ։ Բայց երբեմն դու կարող ես ստեղծել զանգված, որն ունի երկարություն, բայց իրականում չի պարունակում որոշ արժեքներ։
Այսպիսի զանգվածները կոչվում են Sparse Arrays (բացված զանգվածներ)։
Ինչ են Sparse Arrays-ը
Sparse array-ը զանգված է, որի որոշ ինդեքսներ բացակայում են լրիվ։ Այսինքն՝ այդ ինդեքսները չեն պարունակում արժեք և նույնիսկ undefined չեն, այլ պարզապես գոյություն չունեն։
const sparse = [1, , 3];
console.log(sparse[1]); // undefined
console.log(1 in sparse); // false → ինդեքսը չկա
Ո՞րն է տարբերությունը undefined-ի և բացակա արժեքի միջև
const a = [undefined];
const b = [];
a.length === 1; // true
b.length === 0; // true
0 in a; // true → արժեք կա (թեկուզ undefined)
0 in b; // false → արժեք չկա ընդհանրապես
Չնայած sparse[1] վերադարձնում է undefined, դա չի նշանակում, որ արժեք կա։ Իրականում ինդեքս 1-ը ընդհանրապես գոյություն չունի։ Դա է տարբերությունը։
Ինչպես են ստեղծվում Sparse Arrays
1. Ստորակետերով բաց թողնելով արժեք
const arr = [1, , 3];
2. Ստեղծելով զանգված կոնստրուկտորով
const arr = new Array(5); // arr.length = 5, բայց չկա ոչ մի արժեք
Բայց այս զանգվածը դատարկ է, ոչ թե undefined-ներով լի։
Ստուգենք՝
console.log(arr[0]); // undefined
console.log(0 in arr); // false
Տարբերություն undefined արժեքի և բաց ինդեքսի միջև
const a = [undefined]; // 0 ինդեքսում կա undefined արժեք
const b = []; // դատարկ զանգված
console.log(0 in a); // true
console.log(0 in b); // false
Ինչպես են մեթոդները արձագանքում Sparse Array-ներին
եթոդներ որոնք բաց են թողնում բաց ինդեքսները
- forEach
- map
- filter
- reduce
const arr = [1, , 3];
arr.forEach((val, i) => {
console.log(i, val);
});
// կտպի միայն 0 և 2 ինդեքսները
Մեթոդներ որոնք կարող են հաշվի առնել բոլոր ինդեքսները
- for ցիկլ
- for...in
- Object.keys
for (let i = 0; i < arr.length; i++) {
if (i in arr) {
console.log(i, arr[i]);
}
}
// 0 1
// 2 3
Ինչու պետք է խուսափել Sparse Array-ներից
- Դժվար է debug անել
- Վտանգավոր է՝ կարող ես սխալվել undefined-ի հետ
- Մեթոդները անհամաչափ են աշխատում
- Կարող են անարդյունավետ լինել
Լավ պրակտիկա
// վատ
const arr = [1, , 3];
const a = new Array(5);
// լավ
const arr = [1, undefined, 3];
const a = Array.from({ length: 5 }, () => null);
Եզրակացություն
Sparse arrays-ները փոքրիկ թաքնված խնդիրներ են JavaScript-ում։ Դրանք կարող են թվալ անմեղ, բայց սխալ օգտագործման դեպքում կարող են առաջացնել անսպասելի բագեր ու անարդյունավետություն։ Լավագույն պրակտիկան է՝ միշտ հստակորեն սահմանել բոլոր ինդեքսների արժեքները, նույնիսկ եթե դրանք null կամ undefined են։