Menyortir properti objek berdasarkan nilai

696

Jika saya memiliki objek JavaScript seperti:

var list = {
  "you": 100, 
  "me": 75, 
  "foo": 116, 
  "bar": 15
};

Apakah ada cara untuk mengurutkan properti berdasarkan nilai? Sehingga saya berakhir dengan

list = {
  "bar": 15, 
  "me": 75, 
  "you": 100, 
  "foo": 116
};
Steerpike
sumber
4
Bukan hanya "menyortir," tetapi lebih penting lagi menyortir angka. Angka kebal terhadap metode Javascripts Array.sort (), artinya Anda tidak hanya harus menemukan metode untuk menyortir properti, tetapi Anda harus menulis fungsi sendiri untuk membandingkan nilai numerik.
Sampson
106
Sebelum Anda membaca jawabannya: Jawabannya adalah Tidak . Pemesanan properti objek tidak standar dalam ECMAScript. Anda tidak boleh membuat asumsi tentang urutan elemen dalam objek JavaScript. Objek adalah kumpulan properti yang tidak diurutkan. Jawaban di bawah ini menunjukkan kepada Anda bagaimana "menggunakan" properti yang diurutkan, menggunakan bantuan array, tetapi tidak pernah benar-benar mengubah urutan properti objek itu sendiri. Jadi, tidak, itu tidak mungkin. Sekalipun Anda membangun objek dengan properti yang sudah diatur sebelumnya, tidak dijamin akan ditampilkan dalam urutan yang sama di masa mendatang. Baca terus :).
Govind Rai
3
@GovindRai, dalam aplikasi frontend dunia nyata kita mengulang koleksi objek dengan ID sebagai kunci dan urutannya penting jika diterjemahkan ke templat HTML. Anda mengatakan mereka tidak memiliki pesanan, saya mengatakan mereka memiliki urutan persis yang saya lihat ketika console.logging mereka di browser saat ini. Dan perintah itu bisa dipesan ulang. Segera setelah Anda mengulanginya, mereka memiliki pesanan.
ProblemsOfSumit
7
@GovindRai: Sekarang ada cara mengakses properti dalam urutan tertentu dalam spesifikasi. Apakah itu ide yang bagus? Hampir pasti tidak. :-) Tapi itu ada, pada ES2015.
TJ Crowder
7
2019 pengunjung: periksa Object.entriesjawaban berbasis- hampir tidak ter
upgrade

Jawaban:

705

Pindahkan mereka ke array, susun array itu, dan kemudian gunakan array itu untuk tujuan Anda. Inilah solusinya:

var maxSpeed = {
    car: 300, 
    bike: 60, 
    motorbike: 200, 
    airplane: 1000,
    helicopter: 400, 
    rocket: 8 * 60 * 60
};
var sortable = [];
for (var vehicle in maxSpeed) {
    sortable.push([vehicle, maxSpeed[vehicle]]);
}

sortable.sort(function(a, b) {
    return a[1] - b[1];
});

//[["bike", 60], ["motorbike", 200], ["car", 300],
//["helicopter", 400], ["airplane", 1000], ["rocket", 28800]]

Setelah Anda memiliki array, Anda bisa membangun kembali objek dari array dalam urutan yang Anda suka, sehingga mencapai apa yang Anda ingin lakukan. Itu akan bekerja di semua browser yang saya tahu, tetapi itu akan tergantung pada kekhasan implementasi, dan bisa pecah kapan saja. Anda tidak boleh membuat asumsi tentang urutan elemen dalam objek JavaScript.

var objSorted = {}
sortable.forEach(function(item){
    objSorted[item[0]]=item[1]
})
Nosredna
sumber
24
Bisakah Anda memformulasikan ulang "Anda dapat membangun kembali" menjadi "Anda dapat menggunakan array untuk mempertahankan urutan kunci dan menarik nilai dari objek"? Tidak hanya itu non-standar, seperti yang telah Anda sebutkan sendiri, anggapan keliru ini dipatahkan oleh lebih banyak peramban daripada hanya Chrome hari ini, jadi lebih baik tidak mendorong pengguna untuk mencobanya.
Oleg V. Volkov
32
Ini adalah versi kode Anda yang lebih ringkas. Object.keys (maxSpeed) .sort (fungsi (a, b) {return - (maxSpeed ​​[a] - maxSpeed ​​[b])});
TheBrain
6
@TheBrain: Hanya untuk menambahkan, keys()hanya didukung oleh IE9 + (dan browser modern lainnya), jika itu menjadi perhatian. Juga keys()mengecualikan properti enumerable dari rantai prototipe elemen (tidak seperti untuk .. dalam) - tetapi itu biasanya lebih diinginkan.
MrWhite
31
_.pairsmengubah objek menjadi [[key1, value1], [key2, value2]]. Lalu panggil semacam itu. Kemudian panggil _.objectuntuk mengembalikannya.
Funkodebat
2
Proyek saya membutuhkan kunci objek untuk menggabungkan dengan bersih, tetapi juga membutuhkan pengurutan eksplisit saat metadata mendorong UI. Saya mengikuti pendekatan yang sama hanya saya menambahkan cek hasOwnProperty untuk menghindari merangkak rantai prototipe. Berikut ini adalah artikel yang bagus tentang beralih
Nathan Agersea
416

Kami tidak ingin menduplikasi seluruh struktur data, atau menggunakan array di mana kami membutuhkan array asosiatif.

Berikut cara lain untuk melakukan hal yang sama dengan bonna:

var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
keysSorted = Object.keys(list).sort(function(a,b){return list[a]-list[b]})
console.log(keysSorted);     // bar,me,you,foo

Markus R
sumber
22
Ini sepertinya disortir berdasarkan kunci, bukan nilai, yang bukan pertanyaannya?
Michael
27
Ini diurutkan berdasarkan nilai, dan menampilkan kunci - tetapi kami kehilangan nilai saat dicetak, karena hanya mencetak kunci.
Hanna
6
Urutan properti objek tidak dijamin dalam JavaScript, jadi penyortiran harus dilakukan ke dalam array, bukan objek (yang Anda sebut sebagai 'array asosiatif').
Christopher Meyers
6
Jangan lupa keysSortedadalah sebuah array! Bukan benda!
Green
17
Jika Anda menambahkan .map(key => list[key]);ke akhir semacam itu, itu akan mengembalikan seluruh objek, bukan hanya kunci
James Moran
183

Objek Anda dapat memiliki jumlah properti apa pun dan Anda dapat memilih untuk mengurutkan berdasarkan properti objek apa pun yang Anda inginkan, jumlah atau string, jika Anda meletakkan objek dalam array. Pertimbangkan array ini:

var arrayOfObjects = [   
    {
        name: 'Diana',
        born: 1373925600000, // Mon, Jul 15 2013
        num: 4,
        sex: 'female'
    },
    {

        name: 'Beyonce',
        born: 1366832953000, // Wed, Apr 24 2013
        num: 2,
        sex: 'female'
    },
    {            
        name: 'Albert',
        born: 1370288700000, // Mon, Jun 3 2013
        num: 3,
        sex: 'male'
    },    
    {
        name: 'Doris',
        born: 1354412087000, // Sat, Dec 1 2012
        num: 1,
        sex: 'female'
    }
];

urutkan berdasarkan tanggal lahir, terlama lebih dulu

// use slice() to copy the array and not just make a reference
var byDate = arrayOfObjects.slice(0);
byDate.sort(function(a,b) {
    return a.born - b.born;
});
console.log('by date:');
console.log(byDate);

diurutkan berdasarkan nama

var byName = arrayOfObjects.slice(0);
byName.sort(function(a,b) {
    var x = a.name.toLowerCase();
    var y = b.name.toLowerCase();
    return x < y ? -1 : x > y ? 1 : 0;
});

console.log('by name:');
console.log(byName);

http://jsfiddle.net/xsM5s/16/

anorganik
sumber
1
Urutkan berdasarkan nama tidak boleh substrkarakter pertama; lain Dianadan Debramemiliki pesanan yang tidak ditentukan. Selain itu, byDatejenis Anda sebenarnya menggunakan num, bukan born.
Lawrence Dol
Ini terlihat bagus, tetapi perhatikan bahwa untuk membandingkan string yang bisa Anda gunakanx.localeCompare(y)
Jemar Jones
2
@JemarJones localCompareterlihat seperti fungsi yang sangat berguna! Harap perhatikan bahwa itu tidak akan didukung di setiap browser - IE 10 dan kurang, Safari Mobile 9 dan kurang.
inorganik
@inorganik Ya catatan yang sangat bagus untuk mereka yang perlu mendukung browser tersebut
Jemar Jones
1
Ini adalah array dari Objects, yang bukan OP minta (Objek dengan beberapa properti)
João Pimentel Ferreira
62

Demi kelengkapan, fungsi ini mengembalikan array properti objek yang diurutkan :

function sortObject(obj) {
    var arr = [];
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop)) {
            arr.push({
                'key': prop,
                'value': obj[prop]
            });
        }
    }
    arr.sort(function(a, b) { return a.value - b.value; });
    //arr.sort(function(a, b) { a.value.toLowerCase().localeCompare(b.value.toLowerCase()); }); //use this to sort as strings
    return arr; // returns array
}

var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
var arr = sortObject(list);
console.log(arr); // [{key:"bar", value:15}, {key:"me", value:75}, {key:"you", value:100}, {key:"foo", value:116}]

Jsfiddle dengan kode di atas ada di sini . Solusi ini didasarkan pada artikel ini .

Biola yang diperbarui untuk menyortir string ada di sini. Anda dapat menghapus kedua konversi .toLowerCase () tambahan dari itu untuk perbandingan string case sensitif.

Stano
sumber
1
Bagaimana dengan array Objek? [{name: Will}, {name: Bill}, {name: Ben}]
Will Hancock
1
Hai Will, Anda dapat menggunakan fungsi localeCompare untuk perbandingan ini. Menambahkannya ke jawaban di atas.
Stano
Solusi bagus Urutan string membutuhkan pengembalian
pfwd
@Stano Solusi yang benar dan sederhana. Terima kasih banyak.
Abrar Hossain
48

ECMAScript 2017 memperkenalkan Object.values / Object.entries. Seperti namanya, yang pertama mengumpulkan semua nilai dari suatu objek ke dalam array, dan yang terakhir melakukan keseluruhan objek ke dalam array [key, value]array; Setara dengan Python dict.values()dan dict.items().

Fitur-fiturnya membuatnya lebih mudah untuk memilah hash ke dalam objek yang dipesan. Sampai sekarang, hanya sebagian kecil platform JavaScript yang mendukungnya , tetapi Anda dapat mencobanya di Firefox 47+.

let obj = {"you": 100, "me": 75, "foo": 116, "bar": 15};

let entries = Object.entries(obj);
// [["you",100],["me",75],["foo",116],["bar",15]]

let sorted = entries.sort((a, b) => a[1] - b[1]);
// [["bar",15],["me",75],["you",100],["foo",116]]
Kiding
sumber
bagaimana ini mungkin menjawab judul pertanyaan Sorting JavaScript Object by property value? Anda salah mengerti pertanyaan saya pikir, karena Anda harus mengubah Objek asli dan tidak membuat Array baru dari itu.
vsync
2
@vsync Jawaban ini memberikan hasil yang sama dengan jawaban yang diterima, tetapi dengan lebih sedikit kode dan tidak ada variabel sementara.
Darren Cook
3
FWIW, jawaban ini bersih dan merupakan satu-satunya yang membantu saya.
NetOperator Wibby
hanya di ff, bukan ie, atau chrome lagi mereka mengurutkan objek secara otomatis. wtf
fb
Perhatikan bahwa ini tidak akan menyimpan kunci.
Vael Victus
40

Versi "panah" dari jawaban @marcusR untuk referensi

var myObj = {"you": 100, "me": 75, "foo": 116, "bar": 15};
keysSorted = Object.keys(myObj).sort((a,b) => myObj[a]-myObj[b])
alert(keysSorted);     // bar,me,you,foo

UPDATE: April 2017 - Ini mengembalikan myObjobjek yang diurutkan yang ditentukan di atas.

Object
 .keys(myObj)
 .sort((a, b) => myObj[a]-myObj[b])
 .reduce((_sortedObj, key) => ({
   ..._sortedObj, 
   [key]: myObj[key]
 }), {})

Coba di sini!

PEMBARUAN: Oktober 2018 - Versi Object.entries

Object
 .entries(myObj)
 .sort()
 .reduce((_sortedObj, [k,v]) => ({
   ..._sortedObj, 
   [k]: v
 }), {})

Coba di sini!

Jason J. Nathan
sumber
1
tidak bekerja untukvar myObj = {"1": {"Value": 40}, "2": {"Value": 10}, "3": {"Value": 30}, "4": {"Value": 20}};
Rohanil
5
Pertanyaan OP, bersama dengan jawaban ini tidak mengandung objek bersarang @Rohanil Mungkin Anda ingin menanyakan pertanyaan lain alih-alih memilih. Objek bersarang Anda dengan berbagai jenis jelas membutuhkan lebih dari yang disediakan solusi ini
Jason J. Nathan
Hanya sebuah catatan: pembaruan Anda tidak akan berfungsi sebenarnya. Setidaknya tidak di mana-mana dan bukan karena entries. Menurut standar, objek adalah kumpulan properti yang tidak berurutan . Nah, itu berarti jika Anda mencoba untuk membangun objek baru setelah mengurutkannya berdasarkan nilai properti atau apa pun, pemesanan kunci properti menjadi tidak terdefinisi lagi. Chrome, misalnya, secara default memesan kunci properti, sehingga setiap upaya untuk memesannya secara berbeda tidak berguna. Satu-satunya kesempatan Anda adalah untuk mendapatkan "indeks" berdasarkan preferensi pemesanan Anda dan melintasi objek aslinya sesuai.
ZorgoZ
Ya @ZorgoZ, Anda benar dan banyak orang telah menyebutkannya di pos ini. Sebagian besar waktu, kami menggunakan fungsi ini sebagai transformasi sebelum mengkonversi ke tipe lain (seperti JSON) atau sebelum fungsi pengurangan lainnya. Jika tujuannya adalah untuk mengubah objek setelahnya, maka mungkin ada hasil yang tidak terduga. Saya telah sukses dengan fungsi ini di seluruh mesin.
Jason J. Nathan
Catatan: Anda tidak ingin menggunakan sort()padaObject.entries()
Solvitieg
36

Objek JavaScript tidak berurutan menurut definisi (lihat Spesifikasi Bahasa ECMAScript , bagian 8.6). Spesifikasi bahasa bahkan tidak menjamin bahwa, jika Anda mengulangi properti dua kali berturut-turut, mereka akan keluar dalam urutan yang sama untuk kedua kalinya.

Jika Anda perlu memesan sesuatu, gunakan array dan metode Array.prototype.sort.

NickFitz
sumber
4
Perhatikan bahwa sudah ada sedikit perdebatan tentang hal ini. Sebagian besar implementasi menyimpan daftar dalam urutan elemen ditambahkan. IIRC, Chrome tidak. Ada argumen tentang apakah Chrome harus sejalan dengan implementasi lainnya. Keyakinan saya adalah bahwa objek JavaScript adalah hash dan tidak ada urutan yang harus diambil. Saya percaya Python melewati argumen yang sama dan daftar hash-like baru baru-baru ini diperkenalkan. Untuk sebagian besar browser, Anda BISA melakukan apa yang Anda inginkan dengan membuat ulang objek Anda, menambahkan elemen dengan nilai yang diurutkan. Tetapi Anda seharusnya tidak melakukannya.
Nosredna
Edit. Chrome biasanya menjaga ketertiban, tetapi tidak selalu. Dan inilah bug Chromium yang relevan: code.google.com/p/chromium/issues/detail?id=883
Nosredna
6
Laporan bug tersebut tidak dapat dibenarkan, dan mereka yang mengandalkan perilaku tidak berdokumen adalah orang-orang yang memiliki bug tersebut. Baca bagian ECMASCript 8.6; ini dengan jelas menyatakan bahwa "Sebuah Objek adalah kumpulan properti yang tidak terurut". Siapa pun yang menemukan bahwa itu tidak terlihat seperti itu dalam beberapa implementasi, dan kemudian mulai bergantung pada perilaku spesifik implementasi itu, membuat kesalahan besar, dan mereka seharusnya tidak berusaha mengalihkan kesalahan dari diri mereka sendiri. Jika saya di tim Chrome, saya akan menandai laporan bug itu sebagai "Tidak Valid, WontFix".
NickFitz
8
EcmaScript 5 sebenarnya mendefinisikan urutan enumerasi menjadi urutan penyisipan - tidak adanya definisi dianggap sebagai bug spesifikasi di ES3. Patut dicatat bahwa spec EcmaScript mendefinisikan perilaku yang tidak akan dianggap waras oleh siapa pun - sebagai contoh perilaku spec adalah kesalahan sintaksis dalam banyak kasus dilempar pada saat runtime, penggunaan yang salah dari melanjutkan, break, ++, -, const, dll sesuai ke spec mesin apa pun yang melempar pengecualian sebelum mencapai kode yang salah
olliej
4
@olliej - Saya rasa ini tidak benar. Spesifikasi mengatakan: "Mekanika dan urutan penghitungan properti (langkah 6.a dalam algoritma pertama, langkah 7.a dalam yang kedua) tidak ditentukan". Ini ada di halaman 92 dari PDF draf final.
whitneyland
25

OK , seperti yang Anda ketahui, javascript memiliki fungsi sort () , untuk mengurutkan array, tetapi tidak untuk objek ...

Jadi dalam hal ini, kita perlu entah bagaimana mendapatkan array kunci dan mengurutkannya, itulah alasan apis memberi Anda objek dalam array sebagian besar waktu, karena Array memiliki lebih banyak fungsi asli untuk bermain dengan mereka daripada objek literal, bagaimanapun, solusi cepat menggunakan Object.key yang mengembalikan array dari kunci objek, saya membuat fungsi ES6 di bawah ini yang melakukan pekerjaan untuk Anda, ia menggunakan fungsi sort asli () dan mengurangi () dalam javascript:

function sortObject(obj) {
  return Object.keys(obj)
    .sort().reduce((a, v) => {
    a[v] = obj[v];
    return a; }, {});
}

Dan sekarang Anda dapat menggunakannya seperti ini:

let myObject = {a: 1, c: 3, e: 5, b: 2, d: 4};
let sortedMyObject = sortObject(myObject);

Periksa objek sortir MyOb dan Anda dapat melihat hasilnya diurutkan dengan kunci seperti ini:

{a: 1, b: 2, c: 3, d: 4, e: 5}

Juga dengan cara ini, objek utama tidak akan disentuh dan kami benar-benar mendapatkan objek baru.

Saya juga membuat gambar di bawah ini, untuk membuat langkah-langkah fungsi lebih jelas, jika Anda perlu mengubahnya sedikit untuk bekerja dengan cara Anda:

Menyortir objek javascript berdasarkan nilai properti

Alireza
sumber
4
Ini mengurutkan berdasarkan kunci, bukan berdasarkan nilai.
ROROROOROROR
@ROROROOROROR, itu hanya indikasi cara kerjanya karena mereka tidak jauh berbeda, tetapi semua bagus, saya akan menambahkan pengurutan berdasarkan nilai juga
Alireza
1
Menyortir berdasarkan nilai salah dan itu adalah dataset Anda. Ubah c: 3ke c: 13dan Anda akan melihatnya berantakan.
VtoCorleone
1
@VtoCorleone Itu hanya kesalahan penyortiran alami, 1 lebih dulu, bukan cacat dalam algoritma seperti yang disajikan.
Michael Ryan Soileau
10
var list = {
    "you": 100, 
    "me": 75, 
    "foo": 116, 
    "bar": 15
};

function sortAssocObject(list) {
    var sortable = [];
    for (var key in list) {
        sortable.push([key, list[key]]);
    }
    // [["you",100],["me",75],["foo",116],["bar",15]]

    sortable.sort(function(a, b) {
        return (a[1] < b[1] ? -1 : (a[1] > b[1] ? 1 : 0));
    });
    // [["bar",15],["me",75],["you",100],["foo",116]]

    var orderedList = {};
    for (var idx in sortable) {
        orderedList[sortable[idx][0]] = sortable[idx][1];
    }

    return orderedList;
}

sortAssocObject(list);

// {bar: 15, me: 75, you: 100, foo: 116}
Vasil Nikolov
sumber
Sederhana dan Sempurna! Ini menjawab pertanyaan. Terima kasih.
Ajay Singh
Urutan kunci tidak dijamin dalam javascript sehingga ini gagal bagi saya jika kunci bilangan bulat atau sejenisnya
ParoX
tepat, ParoX. Ini tidak berfungsi dengan benar ketika kuncinya adalah tipe integer.
jungwon jin
8

Perbarui dengan ES6: Jika kekhawatiran Anda memiliki objek yang diurutkan untuk beralih melalui (itulah sebabnya saya membayangkan Anda ingin properti objek Anda diurutkan), Anda dapat menggunakan Peta objek .

Anda dapat memasukkan pasangan (kunci, nilai) Anda dalam urutan yang diurutkan dan kemudian melakukan for..ofloop akan menjamin memiliki mereka loop dalam urutan yang Anda masukkan.

var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");
for (var [key, value] of myMap) {
  console.log(key + " = " + value);
}
// 0 = zero 
// 1 = one
julianljk
sumber
Juga di ES6 (ES2015): sifat Obyek yang memiliki pesanan (atau ada suatu cara untuk mengakses mereka dalam urutan yang ditetapkan, tergantung pada sudut pandang Anda). Jika nama properti adalah string dan tidak terlihat seperti indeks array, urutannya adalah urutan yang ditambahkan ke objek. Agar ini tidak ditentukan harus dihormati oleh for-inatau Object.keys, tetapi ini didefinisikan harus dihormati oleh Object.getOwnPropertyNamesdan metode baru lainnya untuk mengakses array nama properti. Jadi itu pilihan lain.
TJ Crowder
Tapi di mana operasi `sort '? Mereka tidak diurutkan sama sekali
Hijau
@Green Saya pikir apa yang ingin saya soroti di sini adalah bahwa, dengan MapAnda sebenarnya memiliki struktur data yang dapat menyimpan dalam urutan yang diurutkan (mengurutkan data Anda, mengulanginya dan menyimpannya di peta) di mana Anda tidak dijamin dengan benda.
julianljk
6

Underscore.js atau Lodash.js untuk array atau objek tingkat lanjut

 var data={
        "models": {

            "LTI": [
                "TX"
            ],
            "Carado": [
                "A",
                "T",
                "A(пасс)",
                "A(груз)",
                "T(пасс)",
                "T(груз)",
                "A",
                "T"
            ],
            "SPARK": [
                "SP110C 2",
                "sp150r 18"
            ],
            "Autobianchi": [
                "A112"
            ]
        }
    };

    var arr=[],
        obj={};
    for(var i in data.models){
      arr.push([i, _.sortBy(data.models[i],function (el){return el;})]);
    }
    arr=_.sortBy(arr,function (el){
      return el[0];
    });
    _.map(arr,function (el){return obj[el[0]]=el[1];});
     console.log(obj);

demo

Roman Yudin
sumber
6

Sangat singkat dan sederhana!

var sortedList = {};
Object.keys(list).sort((a,b) => list[a]-list[b]).forEach((key) => {
    sortedList[key] = list[key]; });
Maryam Koulaei
sumber
5

Saya mengikuti solusi yang diberikan oleh slebetman (baca untuk semua detailnya), tetapi disesuaikan, karena objek Anda tidak bersarang.

// First create the array of keys/values so that we can sort it:
var sort_array = [];
for (var key in list) {
    sort_array.push({key:key,value:list[key]});
}

// Now sort it:
sort_array.sort(function(x,y){return x.value - y.value});

// Now process that object with it:
for (var i=0;i<sort_array.length;i++) {
    var item = list[sort_array[i].key];

    // now do stuff with each item
}
bonna
sumber
4

Mengurutkan nilai tanpa banyak for-loop (untuk mengurutkan berdasarkan kunci, ubah indeks pada sortir callback ke "0")

const list = {
    "you": 100, 
    "me": 75, 
    "foo": 116, 
    "bar": 15
  };

let sorted = Object.fromEntries(
                Object.entries(list).sort( (a,b) => a[1] - b[1] )    
             ) 
console.log('Sorted object: ', sorted) 

dino4udo
sumber
2

Ini bisa menjadi cara sederhana untuk menanganinya sebagai objek yang diperintahkan nyata. Tidak yakin seberapa lambat itu. juga mungkin lebih baik dengan loop sementara.

Object.sortByKeys = function(myObj){
  var keys = Object.keys(myObj)
  keys.sort()
  var sortedObject = Object()
  for(i in keys){
    key = keys[i]
    sortedObject[key]=myObj[key]
   }

  return sortedObject

}

Dan kemudian saya menemukan fungsi terbalik ini dari: http://nelsonwells.net/2011/10/swap-object-key-and-values-in-javascript/

Object.invert = function (obj) {

  var new_obj = {};

  for (var prop in obj) {
    if(obj.hasOwnProperty(prop)) {
      new_obj[obj[prop]] = prop;
    }
  }

  return new_obj;
};

Begitu

var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
var invertedList = Object.invert(list)
var invertedOrderedList = Object.sortByKeys(invertedList)
var orderedList = Object.invert(invertedOrderedList)
Carson Wright
sumber
2
a = { b: 1, p: 8, c: 2, g: 1 }
Object.keys(a)
  .sort((c,b) => {
    return a[b]-a[c]
  })
  .reduce((acc, cur) => {
    let o = {}
    o[cur] = a[cur]
    acc.push(o)
    return acc
   } , [])

output = [{p: 8}, {c: 2}, {b: 1}, {g: 1}]

Kiran Debnath
sumber
2

Untuk berjaga-jaga, seseorang mencari untuk menjaga objek (dengan kunci dan nilai), menggunakan referensi kode oleh @Markus R dan komentar @James Moran, cukup gunakan:

var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
var newO = {};
Object.keys(list).sort(function(a,b){return list[a]-list[b]})
                 .map(key => newO[key] = list[key]);
console.log(newO);  // {bar: 15, me: 75, you: 100, foo: 116}
esneyderp
sumber
2
Anda akan mengembalikan tugas dalam hal itu map, forEachakan lebih baik
DiegoRBaquero
2
let toSort = {a:2323, b: 14, c: 799} 
let sorted = Object.entries(toSort ).sort((a,b)=> a[1]-b[1]) 

Keluaran:

[ [ "b", 14 ], [ "c", 799 ], [ "a", 2323 ] ]
Remi Prasanna
sumber
1

banyak fungsi yang serupa dan bermanfaat: https://github.com/shimondoodkin/groupbyfunctions/

function sortobj(obj)
{
    var keys=Object.keys(obj);
    var kva= keys.map(function(k,i)
    {
        return [k,obj[k]];
    });
    kva.sort(function(a,b){
        if(a[1]>b[1]) return -1;if(a[1]<b[1]) return 1;
        return 0
    });
    var o={}
    kva.forEach(function(a){ o[a[0]]=a[1]})
    return o;
}

function sortobjkey(obj,key)
{
    var keys=Object.keys(obj);
    var kva= keys.map(function(k,i)
    {
        return [k,obj[k]];
    });
    kva.sort(function(a,b){
        k=key;      if(a[1][k]>b[1][k]) return -1;if(a[1][k]<b[1][k]) return 1;
        return 0
    });
    var o={}
    kva.forEach(function(a){ o[a[0]]=a[1]})
    return o;
}
Shimon Doodkin
sumber
1

Objek diurutkan berdasarkan nilai (DESC)

function sortObject(list) {
  var sortable = [];
  for (var key in list) {
    sortable.push([key, list[key]]);
  }

  sortable.sort(function(a, b) {
    return (a[1] > b[1] ? -1 : (a[1] < b[1] ? 1 : 0));
  });

  var orderedList = {};
  for (var i = 0; i < sortable.length; i++) {
    orderedList[sortable[i][0]] = sortable[i][1];
  }

  return orderedList;
}
victorhazbun
sumber
1

Ini satu contoh lagi:

function sortObject(obj) {
  var arr = [];
  var prop;
  for (prop in obj) {
    if (obj.hasOwnProperty(prop)) {
      arr.push({
        'key': prop,
        'value': obj[prop]
      });
    }
  }
  arr.sort(function(a, b) {
    return a.value - b.value;
  });
  return arr; // returns array
}
var list = {
  car: 300,
  bike: 60,
  motorbike: 200,
  airplane: 1000,
  helicopter: 400,
  rocket: 8 * 60 * 60
};
var arr = sortObject(list);
console.log(arr);

Mahendra Kulkarni
sumber
1
    var list = {
    "you": 100,
    "me": 75,
    "foo": 116,
    "bar": 15
};
var tmpList = {};
while (Object.keys(list).length) {
    var key = Object.keys(list).reduce((a, b) => list[a] > list[b] ? a : b);
    tmpList[key] = list[key];
    delete list[key];
}
list = tmpList;
console.log(list); // { foo: 116, you: 100, me: 75, bar: 15 }
Milad Aslani
sumber
1

TypeScript

Fungsi berikut mengurutkan objek berdasarkan nilai atau properti nilai. Jika Anda tidak menggunakan TypeScript, Anda dapat menghapus informasi jenis untuk mengubahnya menjadi JavaScript.

/**
 * Represents an associative array of a same type.
 */
interface Dictionary<T> {
  [key: string]: T;
}

/**
 * Sorts an object (dictionary) by value or property of value and returns
 * the sorted result as a Map object to preserve the sort order.
 */
function sort<TValue>(
  obj: Dictionary<TValue>,
  valSelector: (val: TValue) => number | string,
) {
  const sortedEntries = Object.entries(obj)
    .sort((a, b) =>
      valSelector(a[1]) > valSelector(b[1]) ? 1 :
      valSelector(a[1]) < valSelector(b[1]) ? -1 : 0);
  return new Map(sortedEntries);
}

Pemakaian

var list = {
  "one": { height: 100, weight: 15 },
  "two": { height: 75, weight: 12 },
  "three": { height: 116, weight: 9 },
  "four": { height: 15, weight: 10 },
};

var sortedMap = sort(list, val => val.height);

Urutan kunci dalam objek JavaScript tidak dijamin, jadi saya menyortir dan mengembalikan hasilnya sebagai Map objek yang mempertahankan urutan pengurutan.

Jika Anda ingin mengubahnya kembali ke Object, Anda dapat melakukan ini:

var sortedObj = {} as any;
sortedMap.forEach((v,k) => { sortedObj[k] = v });
orad
sumber
1

input adalah objek, output adalah objek, menggunakan lib bawaan & js bawaan, dengan opsi menurun atau naik, dan tidak bermutasi objek input

misalnya input & output

{
  "a": 1,
  "b": 4,
  "c": 0,
  "d": 2
}
{
  "b": 4,
  "d": 2,
  "a": 1,
  "c": 0
}

Pelaksanaan

const _ = require('lodash');

const o = { a: 1, b: 4, c: 0, d: 2 };


function sortByValue(object, descending = true) {
  const { max, min } = Math;
  const selector = descending ? max : min;

  const objects = [];
  const cloned = _.clone(object);

  while (!_.isEmpty(cloned)) {
    const selectedValue = selector(...Object.values(cloned));
    const [key, value] = Object.entries(cloned).find(([, value]) => value === selectedValue);

    objects.push({ [key]: value });
    delete cloned[key];
  }

  return _.merge(...objects);
}

const o2 = sortByValue(o);
console.log(JSON.stringify(o2, null, 2));
James T.
sumber
1
const arrayOfObjects = [
{name: 'test'},
{name: 'test2'}
]

const order = ['test2', 'test']

const setOrder = (arrayOfObjects, order) =>
    arrayOfObjects.sort((a, b) => {
        if (order.findIndex((i) => i === a.name) < order.findIndex((i) => i === b.name)) {
            return -1;
        }

        if (order.findIndex((i) => i === a.name) > order.findIndex((i) => i === b.name)) {
            return 1;
        }

        return 0;
    });
Oleg
sumber
1

solusi saya dengan mengurutkan:

let list = {
    "you": 100, 
    "me": 75, 
    "foo": 116, 
    "bar": 15
};

let sorted = Object.entries(list).sort((a,b) => a[1] - b[1]);

for(let element of sorted) {
    console.log(element[0]+ ": " + element[1]);
}
Ivan Bozveliev
sumber
Harap format kode Anda sebagai kode
Itamar Mushkin
1
<pre>
function sortObjectByVal(obj){  
var keysSorted = Object.keys(obj).sort(function(a,b){return obj[b]-obj[a]});
var newObj = {};
for(var x of keysSorted){
    newObj[x] = obj[x];
}
return newObj;

}
var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
console.log(sortObjectByVal(list));
</pre>
Chirag Modi
sumber
1
Selamat datang di stackoverflow. Selain jawaban yang Anda berikan, silakan pertimbangkan untuk memberikan penjelasan singkat tentang mengapa dan bagaimana ini memperbaiki masalah.
jtate
0

Cara lain untuk mengatasi ini: -

var res = [{"s1":5},{"s2":3},{"s3":8}].sort(function(obj1,obj2){ 
 var prop1;
 var prop2;
 for(prop in obj1) {
  prop1=prop;
 }
 for(prop in obj2) {
  prop2=prop;
 }
 //the above two for loops will iterate only once because we use it to find the key
 return obj1[prop1]-obj2[prop2];
});

// res akan memiliki array hasil

vivek_nk
sumber
0

Terima kasih dan lanjutkan jawab @Nosredna

Sekarang kita mengerti objek perlu dikonversi ke array kemudian mengurutkan array. ini berguna untuk mengurutkan array (atau objek yang dikonversi ke array) dengan string:

Object {6: Object, 7: Object, 8: Object, 9: Object, 10: Object, 11: Object, 12: Object}
   6: Object
   id: "6"
   name: "PhD"
   obe_service_type_id: "2"
   __proto__: Object
   7: Object
   id: "7"
   name: "BVC (BPTC)"
   obe_service_type_id: "2"
   __proto__: Object


    //Sort options
    var sortable = [];
    for (var vehicle in options)
    sortable.push([vehicle, options[vehicle]]);
    sortable.sort(function(a, b) {
        return a[1].name < b[1].name ? -1 : 1;
    });


    //sortable => prints  
[Array[2], Array[2], Array[2], Array[2], Array[2], Array[2], Array[2]]
    0: Array[2]
    0: "11"
    1: Object
        id: "11"
        name: "AS/A2"
        obe_service_type_id: "2"
        __proto__: Object
        length: 2
        __proto__: Array[0]
    1: Array[2]
    0: "7"
    1: Object
        id: "7"
        name: "BVC (BPTC)"
        obe_service_type_id: "2"
        __proto__: Object
        length: 2
Kemarahan
sumber
0

Coba ini. Bahkan objek Anda tidak memiliki properti berdasarkan yang Anda coba untuk mengurutkan juga akan ditangani.

Sebut saja dengan mengirim properti dengan objek.

var sortObjectByProperty = function(property,object){

    console.time("Sorting");
    var  sortedList      = [];
         emptyProperty   = [];
         tempObject      = [];
         nullProperty    = [];
    $.each(object,function(index,entry){
        if(entry.hasOwnProperty(property)){
            var propertyValue = entry[property];
            if(propertyValue!="" && propertyValue!=null){
              sortedList.push({key:propertyValue.toLowerCase().trim(),value:entry});  
            }else{
                emptyProperty.push(entry);
           }
        }else{
            nullProperty.push(entry);
        }
    });

      sortedList.sort(function(a,b){
           return a.key < b.key ? -1 : 1;
         //return a.key < b.key?-1:1;   // Asc 
         //return a.key < b.key?1:-1;  // Desc
      });


    $.each(sortedList,function(key,entry){
        tempObject[tempObject.length] = entry.value;
     });

    if(emptyProperty.length>0){
        tempObject.concat(emptyProperty);
    }
    if(nullProperty.length>0){
        tempObject.concat(nullProperty);
    }
    console.timeEnd("Sorting");
    return tempObject;
}
Vali Shah
sumber