Ma'lumot turlari

Object.keys, values, entries

Massivlarda map, filter, reduce kabi qulay metodlar bor edi. Oddiy obyektlar uchun ham xuddi shunga o'xshash universal metodlar mavjud: Object.keys, Object.values va Object.entries. Ushbu darsda ular bilan chuqur tanishamiz.

Nima uchun kerak?

Ba'zan obyektning barcha kalitlari yoki qiymatlari ustida aylanish (iteratsiya) kerak bo'ladi. Buni for..in orqali qilsak bo'ladi, ammo ko'pincha bizga massiv qulayroq โ€” chunki massivda map, filter, sort kabi kuchli metodlar bor.

Aynan shu yerda uch metod yordamga keladi. Ular obyektni massivga aylantirib beradi:

Sintaksis va birinchi misol

E'tibor bering: bu metodlar obj.keys() emas, balki Object.keys(obj) ko'rinishida chaqiriladi โ€” ya'ni obyekt argument sifatida uzatiladi. Bu ataylab shunday qilingan, sababini keyinroq tushuntiramiz.

object-keys.js
// natija shu yerda chiqadi

Ko'rib turganingizdek, uchala metod ham natijani haqiqiy massiv sifatida qaytaradi. Demak, ular ustida massivning barcha metodlarini bemalol ishlatishimiz mumkin.

Bu metodlar faqat obyektning o'ziga tegishli (own) kalitlarini oladi โ€” prototipdan meros qilib olingan xossalarni hisobga olmaydi. Bu odatda aynan bizga kerak bo'lgan xatti-harakat.

for..of bilan aylanish

Bu metodlar massiv qaytargani uchun, ular ustida for..of sikli bilan qulay aylanamiz. Obyektning o'zi ustida for..of ishlamaydi (chunki oddiy obyekt iterable emas), lekin metodlar qaytargan massiv ustida ishlaydi.

for-of-values.js
// natija shu yerda chiqadi

Object.entries bilan aylanganda, har bir element [kalit, qiymat] massivi bo'ladi. Uni to'g'ridan-to'g'ri destrukturizatsiya (keyingi darsda) bilan ochib olsa juda qulay:

entries-loop.js
// natija shu yerda chiqadi

Amaliy misol: qiymatlar yig'indisi

Aytaylik, barcha narxlar yig'indisini hisoblamoqchimiz. Object.values massiv qaytargani uchun, biz massivning reduce metodidan foydalanamiz:

values-sum.js
// natija shu yerda chiqadi
Xuddi shunday, obyektning qiymatlarini filtrlash, saralash yoki o'zgartirish kerak bo'lsa โ€” avval Object.values (yoki entries) bilan massivga o'ting, so'ng massiv metodlaridan foydalaning.

Obyektni o'zgartirish: entries + fromEntries

Massivlarda map, filter bor, lekin obyektlarda yo'q. Shuning uchun obyektni o'zgartirishning eng qulay yo'li shunday:

  1. Object.entries(obj) orqali [kalit, qiymat] juftliklari massivini olamiz;
  2. Massivning map yoki filter metodini qo'llaymiz;
  3. Natijani Object.fromEntries(massiv) orqali yana obyektga aylantiramiz.

Object.fromEntries โ€” bu Object.entriesning teskarisi: u [kalit, qiymat] juftliklari massivini olib, obyekt yasaydi.

from-entries.js
// natija shu yerda chiqadi

Filtrlash misoli โ€” faqat 10000 so'mdan qimmat mahsulotlarni qoldiramiz:

filter-entries.js
// natija shu yerda chiqadi

Map bilan farqi

Map, Set kabi ma'lumot tuzilmalarida ham keys(), values(), entries() metodlari bor. Ammo ular orasida muhim farqlar mavjud:

Nima uchun Object.keys(obj) shaklida, ya'ni obj.keys() emas? Sabab โ€” moslashuvchanlik. JavaScript'da obyektlar turli tuzilmalarning asosi bo'lib xizmat qiladi. Agar bizning obyektimizda o'zining keys nomli metodi bo'lsa, uni buzib qo'ymaslik uchun tashqi Object.keys(obj) shakli ishlatiladi.

Agar Map'ning metodlari qaytargan iterable ustida massiv metodlarini ishlatmoqchi bo'lsangiz, uni Array.from(map.keys()) yoki [...map.keys()] orqali massivga aylantiring.

Xulosa