Loading...

Object.keys, values, entries

Object.keys, values, entries

 

Келгиле, айрым маалыматтар структураларынан алыстап, жалпысынан алардын саналышы жөнүндө сөз кылалы.

Мурунку бөлүмдө биз map.keys()map.values()map.entries().

Бул жалпы ыкмалар жана маалымат структуралары үчүн аларды колдонуу үчүн жалпы конвенция бар. Эгерде биз өзүбүздүн маалымат структурабызды түзүп жаткан болсок, анда биз аларды да ишке ашырышыбыз керек.

структуралар үчүн колдоого алынган ыкмалары:

  • Map
  • Set
  • Array

Жөнөкөй объекттерди окшош ыкмалар менен кайталаса болот, бирок синтаксиси бир аз башкача.

Object.keys, values, entries

Жөнөкөй объекттер үчүн төмөнкү ыкмалар бар:

  • Object.keys(obj) - баскычтардын массивдерин кайтарат.
  • Object.values(obj) - Маанилердин массивдерин кайтарат.
  • Object.entries(obj) - жуптардын массивдерин кайтарат [ключ, значение].

Айырмачылыктарга көңүл буруңуз ( mapмисалы, менен салыштырганда):

  Карта Объект
Чакыруу синтаксиси map.keys() Object.keys(obj), Жокobj.keys()
кайтып келет кайталануучу объект "чыныгы" массив

Биринчи айырмачылык - биз Object.keys(obj)эмес, чалышыбыз керек obj.keys().

Эмнеге андай? Негизги себеби - ийкемдүүлүк. Объекттер JavaScriptтин бардык татаал структураларынын негизи экенин унутпаңыз. dataБизде өзүнүн ыкмасын ишке ашырган объект болушу мүмкүн data.values(). Биз дагы эле ага стандарттык ыкманы колдоно алабыз Object.values(data).

Экинчи айырмачылык, көрүү методдору Object.*кайталануучуларды эле эмес, "чыныгы" массивдерди кайтарат. Бул негизинен тарыхый себептерден улам.

Мисалы:

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

Object.valuesБул жерде циклдеги менчик баалуулуктарын кайталоо үчүн колдонуунун мисалы :

@A@let user = {
  name: "John",
  age: 30
};

// перебор значений
for (let value of Object.values(user)) {
  alert(value); // John, затем 30
}@A@
Object.keys/values/entries символдун касиеттерин этибарга албайт

цикл сыяктуу эле for..in, бул ыкмалар аларды ачкыч катары колдонгон касиеттерге көңүл бурбайт Symbol(...).

Бул, адатта, ыңгайлуу болуп саналат. Бирок символикалык ачкычтарды эске алуу керек болсо, анда бул үчүн Object.getOwnPropertySymbols өзүнчө ыкмасы бар , ал символдук ачкычтардын массивин гана кайтарат. Ошондой эле, бардык ачкычтарды кайтаруучу Reflect.ownKeys(obj) ыкмасы бар .

Объекттин трансформациялары

Объекттерде массивдердин методдору көп эмес, мисалы mapfilterжана башкалар.

Эгерде биз аларды колдонууну кааласак, анда биз аларды Object.entriesкийинки чакыруу менен колдоно алабыз Object.fromEntries:

  1. Чалуу Object.entries(obj)үчүн ачкыч/маани жуптарынын массивдерин кайтарат obj.
  2. Биз ага массив ыкмаларын чакырабыз, мисалы, map.
  3. Object.fromEntries(array)Аны кайра объектке айландыруу үчүн натыйжаны колдонуңуз .

Мисалы, бизде баа бар объект бар жана биз аларды эки эсеге көбөйтүүнү каалайбыз:

@A@let prices = {
  banana: 1,
  orange: 2,
  meat: 4,
};

let doublePrices = Object.fromEntries(
  // преобразовать в массив, затем map, затем fromEntries обратно объект
  Object.entries(prices).map(([key, value]) => [key, value * 2])
);

alert(doublePrices.meat); // 8@A@

Башында татаал көрүнүшү мүмкүн, бирок бир нече колдонуудан кийин түшүнүү оңой болуп калат.

Ушундай жол менен сиз татаалыраак "бир саптык" трансформацияларды жасай аласыз. Код түшүнүү үчүн жетиштүү жөнөкөй болушу үчүн балансты сактоо гана маанилүү.

Tasks

маанилүүлүгү: 5

salariesАйлыктарды камтыган ыктыярдуу сандагы объект бар .

Методду жана циклди sumSalaries(salaries)колдонуп, бардык эмгек акынын суммасын кайтарган функцияны жазыңыз .Object.valuesfor..of

Эгерде объект salariesбош болсо, анда натыйжа болушу керек 0.

Мисалы:

@A@let salaries = {
  "John": 100,
  "Pete": 300,
  "Mary": 250
};

alert( sumSalaries(salaries) ); // 650@A@

Тапшырма үчүн тесттер менен кумкоргонду ачыңыз.

чечим
маанилүүлүгү: 5

count(obj)Объекттин касиеттеринин санын кайтаруучу функцияны жазыңыз :

@A@let user = {
  name: 'John',
  age: 30
};

alert( count(user) ); // 2@A@

Кодду мүмкүн болушунча кыска сактоого аракет кылыңыз.

P.S. Каармандын касиеттерине көңүл бурбаңыз, "кадимки" гана адамдарды санаңыз.