Object.keys, Object.values, Object.entries повертають масиви власних перелічуваних властивостей об'єкта:
const prices = { coffee: 50, tea: 35 };
Object.keys(prices); // ['coffee', 'tea']
Object.values(prices); // [50, 35]
Object.entries(prices); // [['coffee', 50], ['tea', 35]]
for (const [name, price] of Object.entries(prices)) {
console.log(`${name}: ${price} грн`);
}
Оскільки це масиви, до них можна застосувати map, filter, reduce. А назад у об'єкт - через Object.fromEntries:
const withVat = Object.fromEntries(
Object.entries(prices).map(([name, price]) => [name, price * 1.2]),
);
for...in перебирає ключі, але разом з успадкованими перелічуваними властивостями з ланцюжка прототипів:
for (const key in prices) {
if (Object.hasOwn(prices, key)) { /* ... */ }
}
Для звичайних об'єктів успадкованих перелічуваних властивостей зазвичай немає, але якщо якась бібліотека додала метод в Object.prototype, for...in його побачить. Тому в сучасному коді частіше пишуть Object.entries + for...of.
Не плутати for...in і for...of:
for...in- ключі (для масиву - індекси як рядки'0','1');for...of- значення ітерованих об'єктів (масиви, рядки,Map,Set). Звичайний об'єкт не ітерований,for...ofпо ньому кинеTypeError.
Порядок ключів визначений: спершу цілочисельні ключі за зростанням, потім рядкові в порядку додавання.
Object.keys({ b: 1, 2: 1, a: 1, 1: 1 }); // ['1', '2', 'b', 'a']
Це пастка для об'єктів, де ключами є id: { 10: ..., 2: ... } перебереться як 2, 10, а не в порядку додавання. Якщо порядок важливий, краще Map чи масив.
Символьні ключі жоден з цих способів не повертає - для них є Object.getOwnPropertySymbols чи Reflect.ownKeys.