Object keys, values, entries

...

Object.keys, values, entries

Endi individual ma'lumot tuzilmalaridan chetga chiqib, ular ustidan iteratsiya qilish usullari haqida gaplashamiz.

Oldingi bo'limlarda biz map.keys(), map.values(), map.entries() metodlarini ko'rib chiqdik.

Bu metodlar umumiy hisoblanadi va ma'lumot tuzilmalariga nisbatan ishlatilishi kelishilgan. Agar biz o'zimiz uchun ma'lumot tuzilmasi yaratadigan bo'lsak, bu metodlarni ham qo'llashimiz kerak bo'ladi.

Ular quyidagi tuzilmalarda qo'llab-quvvatlanadi:

  • Map
  • Set
  • Array

Oddiy obyektlar (Plain objects) ham shunga o'xshash metodlarni qo'llab-quvvatlaydi, ammo sintaksis biroz boshqacha.

Object.keys, values, entries

Oddiy obyektlar uchun quyidagi metodlar mavjud:

  • Object.keys(obj) – kalitlar massivini qaytaradi.
  • Object.values(obj) – qiymatlar massivini qaytaradi.
  • Object.entries(obj) – [kalit, qiymat] juftliklaridan iborat massivni qaytaradi.

Map bilan taqqoslaganda ba'zi farqlar mavjud:

MapObject
Chaqarish usulimap.keys()Object.keys(obj), ammo obj.keys() emas
Qaytaradiiterable“haqiqiy” massiv (Array)

Birinchi farq shundaki, biz Object.keys(obj) chaqirishimiz kerak, obj.keys() emas.

Nega shunday? Asosiy sabab – bu moslashuvchanlik. Eslasak, obyektlar JavaScript’dagi barcha murakkab tuzilmalarning asosi hisoblanadi. Shunday qilib, bizda o'zimizning data.values() metodiga ega bo'lgan ob'ekt bo'lishi mumkin. Shunda ham biz unga Object.values(data) ni qo'llashimiz mumkin.

Ikkinchi farq shundaki, Object.* metodlari iterable emas, balki “haqiqiy” massivni qaytaradi. Bu asosan tarixiy sabablarga ko'ra.

Masalan:

let user = {
  name: "John",
  age: 30
};
Object.keys(user) = ["name", "age"]
Object.values(user) = ["John", 30]
Object.entries(user) = [ ["name","John"], ["age",30] ]

Mana, Object.values dan foydalanib, obyekt qiymatlarini aylantirish misoli:

let user = {
  name: 'John',
  age: 30,
};
 
// qiymatlar ustidan aylantirish
for (let value of Object.values(user)) {
  alert(value); // John, so'ng 30
}

Object.keys/values/entries simbolik xususiyatlarni e'tiborsiz qoldiradi

for..in sikli kabi, bu metodlar Symbol(...) kalitlari bilan bog'liq xususiyatlarni e'tiborsiz qoldiradi.

Odatda bu qulay. Ammo agar bizga simbolik kalitlar ham kerak bo'lsa, u holda Object.getOwnPropertySymbols metodidan foydalanishimiz mumkin, bu faqat simbolik kalitlarni qaytaradi. Shuningdek, Reflect.ownKeys(obj) metodi mavjud bo'lib, u barcha kalitlarni qaytaradi.

Obyektlarni o'zgartirish

Obyektlarda array uchun mavjud bo'lgan map, filter kabi ko'plab metodlar mavjud emas.

Agar biz ularni qo'llashni xohlasak, unda Object.entries va Object.fromEntries dan foydalanishimiz mumkin:

  1. Object.entries(obj) yordamida obyektdan [kalit/qiymat] juftliklarini olamiz.
  2. Ushbu juftliklarga array metodlarini qo'llaymiz, masalan map, ularni o'zgartirish uchun.
  3. Olingan massivni Object.fromEntries(array) orqali yana obyektga aylantiramiz.

Masalan, bizda narxlar mavjud va ularni ikki baravar oshirmoqchimiz:

let prices = {
  banana: 1,
  orange: 2,
  meat: 4,
};
 
let doublePrices = Object.fromEntries(
  // Narxlarni massivga aylantiramiz, har bir kalit/qiymat juftligini boshqa juftlikka aylantiramiz
  // va fromEntries orqali yana obyektga qaytaramiz
  Object.entries(prices).map((entry) => [entry[0], entry[1] * 2])
);
 
alert(doublePrices.meat); // 8

Dastlab bu qiyin ko'rinishi mumkin, lekin bir-ikki marta qo'llangandan so'ng, tushunish osonlashadi. Biz shu tarzda kuchli transformatsiyalar zanjirlarini yaratishimiz mumkin.

Ushbu sahifada

Xato haqida xabar berish