Lodash menyortir & mengurutkan objek dalam berdasarkan nilai, tanpa kehilangan kuncinya

Saya memiliki kebutuhan serupa dengan posting sebelumnya di ini topik: perlu mengurutkan dan mengurutkan objek tanpa kehilangan kunci. Namun, saya memiliki objek dari objek:

var o = { 
  123: { field: "science", name: "zed" },
  234: { field: "tech", name: "sara" },
  672: { field: "arts", name: "jon" }
}

_.fromPairs(_.sortBy(_.toPairs(o),function(a){ return a[1] }).reverse()) 

Di atas menggunakan solusi lodash yang disebutkan topik lain - namun saya tidak mendapatkan hasil yang konsisten (saya tetap menyimpan kuncinya!)

Bantuan apa pun akan dihargai.


person user7472652    schedule 21.03.2017    source sumber


Jawaban (1)


Saya tidak jelas tentang nilai apa yang ingin Anda urutkan di atas, karena objek tidak ada bandingannya. Katakanlah Anda ingin mengurutkannya berdasarkan bidang nama — Anda akan mendapati bahwa hal itu masih tidak berhasil.

Latar belakang pertama:

Secara historis, properti objek dianggap tidak berurutan di ES. Urutan penghitungan kunci (misalnya dengan for ... in atau Object.keys()) bersifat spesifik untuk implementasi.

Namun urutan enumerasi menjadi perilaku yang ditentukan di ES2015.

Urutan enumerasi tersebut mengkodifikasikan apa yang telah dilakukan sebagian besar mesin:

  1. Kunci yang berupa bilangan bulat dihitung terlebih dahulu, dari yang terendah hingga yang tertinggi.
  2. Kunci string disebutkan dalam urutan penugasan.
  3. Kunci simbol disebutkan dalam urutan penetapan.

Jika Anda perlu menggunakan bilangan bulat sebagai kunci terurut, Anda memerlukan struktur data yang berbeda. Map sesuai:

    const o = { 
      123: { field: "science", name: "zed" },
      234: { field: "tech", name: "sara" },
      672: { field: "arts", name: "jon" }
    }

    const { compare } = new Intl.Collator();

    const res = new Map(Object
      .entries(o)
      .sort(([ , a ], [ , b ]) => compare(a.name, b.name))
    );

    console.log([ ...res ]);

Jika Anda perlu mengkhawatirkan IE lama, serangkaian entri nilai kunci juga sudah cukup.

person Semicolon    schedule 21.03.2017
comment
Ini tampak hebat! Saya memerlukan fleksibilitas dalam penyortiran, bergantung pada apa yang dipilih pengguna. Sekali lagi, berhasil dengan baik, terima kasih! - person user7472652; 22.03.2017