Келгиле, айрым маалыматтар структураларынан алыстап, жалпысынан алардын саналышы жөнүндө сөз кылалы.
Мурунку бөлүмдө биз 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@
цикл сыяктуу эле for..in
, бул ыкмалар аларды ачкыч катары колдонгон касиеттерге көңүл бурбайт Symbol(...)
.
Бул, адатта, ыңгайлуу болуп саналат. Бирок символикалык ачкычтарды эске алуу керек болсо, анда бул үчүн Object.getOwnPropertySymbols өзүнчө ыкмасы бар , ал символдук ачкычтардын массивин гана кайтарат. Ошондой эле, бардык ачкычтарды кайтаруучу Reflect.ownKeys(obj) ыкмасы бар .
Объекттин трансформациялары
Объекттерде массивдердин методдору көп эмес, мисалы map
, filter
жана башкалар.
Эгерде биз аларды колдонууну кааласак, анда биз аларды Object.entries
кийинки чакыруу менен колдоно алабыз Object.fromEntries
:
- Чалуу
Object.entries(obj)
үчүн ачкыч/маани жуптарынын массивдерин кайтаратobj
. - Биз ага массив ыкмаларын чакырабыз, мисалы,
map
. 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
salaries
Айлыктарды камтыган ыктыярдуу сандагы объект бар .
Методду жана циклди sumSalaries(salaries)
колдонуп, бардык эмгек акынын суммасын кайтарган функцияны жазыңыз .Object.values
for..of
Эгерде объект salaries
бош болсо, анда натыйжа болушу керек 0
.
Мисалы:
@A@let salaries = {
"John": 100,
"Pete": 300,
"Mary": 250
};
alert( sumSalaries(salaries) ); // 650@A@
count(obj)
Объекттин касиеттеринин санын кайтаруучу функцияны жазыңыз :
@A@let user = {
name: 'John',
age: 30
};
alert( count(user) ); // 2@A@
Кодду мүмкүн болушунча кыска сактоого аракет кылыңыз.
P.S. Каармандын касиеттерине көңүл бурбаңыз, "кадимки" гана адамдарды санаңыз.