1 September 2021

Objek.kunci, nilai, entri

Mari kita berpaling dari struktur data individual dan membahas iterasi mereka.

Di bab sebelumnya kita telah melihat method map.keys(), map.values(), map.entries().

Method ini generik, ada persetujuan umum untuk menggunakan mereka untuk struktur data. Jika kita pernah menciptakan struktur data sendiri, kita harus mengimplementasikannya juga.

Mereka tersedia untuk:

  • Map
  • Set
  • Array

Objek biasa juga menghadapi method yang mirip, tapi sintaksisnya sedikit berbeda.

Objek.kunci, nilai-nilai, entri-entri

Untuk objek biasa, method berikut tersedia:

Perhatikanlah perbedaannya(dibanding map contohnya):

Map Object
Call syntax map.keys() Object.keys(obj), but not obj.keys()
Returns iterable “real” Array

Perbedaan pertama adalah kita harus memanggil Object.keys(obj), bukan obj.keys().

Mengapa? Alasan pertama adalah fleksibilitas. Ingat, objek adalah dasar dari struktur kompleks di Javascript. Jadi kita mungkin mempunyai objek seperti data yang mengimplemen method data.values() sendirinya. Dan kita masih bisa memanggil Object.values(data) atasnya.

Alasan kedua adalah method Object.* mengembalikan objek array “betulan”, bukan hanya iterable. Itu terutama untuk alasan-alasan historis.

Contohnya:

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

Ini adalah contoh pengunaan Object.values untuk meng-loop atas nilai-nilai properti:

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

// loop atas nilai
for (let value of Object.values(user)) {
  alert(value); // John, then 30
}
Object.keys/values/entries abaikan properti simbolis

Seperti for..in loop, method ini mengabaikan properti yang menggunakan Symbol(...) as keys.

Biasanya itu mudah. Tapi jika kita mau kunci simbolis juga, ada method lain Object.getOwnPropertySymbols yang mengembalikan array berisi kunci simbolis saja. Ada juga method Reflect.ownKeys(obj) yang mengembalikan semua kunci.

Mengubah objek

Objek kekurangan banyak method yang ada untuk arrays, contoh map, filter dan yang lainnya.

Jika kita ingin mengapplikasikan method-method tersebut, kita bisa menggunakan Object.entries diikuti oleh Object.fromEntries:

  1. Gunakan Object.entries(obj) untuk mendapatkan array pasangan kunci/nilai dari obj.
  2. Gunakan method array di array tersebut, contoh map.
  3. Gunakan Object.fromEntries(array) di array hasil untuk mengubahnya kembali menjadi objek.

Sebagai contoh, kita mempunyai objek dengan harga-harga, dan mau melipat duakan harga-harganya:

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

let doublePrices = Object.fromEntries(
  // ubah menjadi array, map, lalu fromEntries mengembalikan objeknya
  Object.entries(prices).map(([key, value]) => [key, value * 2])
);

alert(doublePrices.meat); // 8

Mungkin ini terlihat susah pertama kalinya, tetapi ini akan menjadi mudah untuk di mengerti setelah kamu menggunakannya beberapa kali. Kita bisa membuat perantaian hebat dengan cara ini.

Tugas

Ada objek salaries berisi beberapa gaji orang-orang.

Tulis fungsi sumSalaries(salaries) yang mengembalikan jumlah total semua gaji menggunakan Object.values dan loop for..of.

Jika salaries kosong, lalu hasilnya akan 0.

Contohnya:

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

alert( sumSalaries(salaries) ); // 650

Buka sandbox dengan tes.

function sumSalaries(salaries) {

  let sum = 0;
  for (let salary of Object.values(salaries)) {
    sum += salary;
  }

  return sum; // 650
}

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

alert( sumSalaries(salaries) ); // 650

Atau kita juga bisa mendapatkan jumlah total dengan menggunakan Object.values dan reduce:

// reduce meng-loop atas array gaji,
// menambahkannya
// dan mengembalikan hasilnya
function sumSalaries(salaries) {
  return Object.values(salaries).reduce((a, b) => a + b, 0) // 650
}

Buka solusi dengan tes di sandbox.

Tulis fungsi count(obj) yang mengembalikan jumlah properti di dalam objek:

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

alert( count(user) ); // 2

Coba buat kodenya sependek mungkin.

P.S. Jangan pedulikan properti simbolik, hanya hitung yang “reguler”.

Buka sandbox dengan tes.

function count(obj) {
  return Object.keys(obj).length;
}

Buka solusi dengan tes di sandbox.

Peta tutorial