Nesne özelliğini değerlere göre sıralama


698

Eğer böyle bir JavaScript nesnesi varsa:

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

Özellikleri değere göre sıralamanın bir yolu var mı? Böylece sonunda

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

4
Sadece "sıralama" değil, daha da önemlisi sayıları sıralama. Sayılar Javascripts Array.sort () yöntemine karşı bağışıktır, yani sadece özellikleri sıralamak için bir yöntem bulmak zorunda kalmazsınız, aynı zamanda sayısal değerleri karşılaştırmak için kendi işlevinizi yazmanız gerekir.
Sampson

107
Cevapları okumadan önce: Cevap hayır . ECMAScript'te nesne özelliklerinin sıralaması standart değildir. Bir JavaScript nesnesindeki öğelerin sırası hakkında asla varsayımlarda bulunmamalısınız. Bir Nesne, sıralanmamış bir özellik koleksiyonudur. Aşağıdaki cevaplar, dizilerin yardımıyla sıralı özellikleri nasıl "kullanacağınızı" gösterir, ancak nesnelerin kendilerinin özelliklerinin sırasını asla değiştirmez. Yani, hayır, bu mümkün değil. Öngörülen özelliklere sahip bir nesne oluştursanız bile, gelecekte aynı sırayla görüntüleneceği garanti edilmez. Okumaya devam etmek :).
Govind Rai

3
@GovindRai henüz, gerçek dünya ön uç uygulamalarında, anahtarlar olarak kimliğe sahip nesne koleksiyonları üzerinde döngü yapıyoruz ve HTML şablonlarına çevrildiyse sıra önemlidir. Onların siparişleri olmadığını söylüyorsunuz, diyorum ki tam olarak gördüğüm sıra konsolda. Mevcut tarayıcıda onları kaydederken. Ve bu düzen yeniden sıralanabilir. Onları döngüye alır almaz, bir emir var.
ProblemsOfSumit

7
@GovindRai: Artık özelliklerde belirtilen sırayla özelliklere erişmenin bir yolu var. İyi bir fikir mi? Neredeyse kesinlikle değil. :-) Ama ES2015 itibariyle orada.
TJ Crowder

7
2019 Ziyaretçileri: ES2017'den Object.entriesberi teknolojinin en temiz ve en okunabilir hali olan bu zorlukla yükseltilmiş tabanlı cevabı kontrol edin : stackoverflow.com/a/37607084/245966
jakub.g

Yanıtlar:


706

Onları bir diziye taşıyın, diziyi sıralayın ve sonra bu diziyi amaçlarınız için kullanın. İşte bir çözüm:

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]]

Diziye sahip olduğunuzda, nesneyi diziden istediğiniz sırayla yeniden oluşturabilir ve böylece tam olarak ne yapmak istediğinizi başarabilirsiniz. Bu, bildiğim tüm tarayıcılarda işe yarayacaktır, ancak bir uygulama tuhaflığına bağlı olacaktır ve herhangi bir zamanda kırılabilir. Bir JavaScript nesnesindeki öğelerin sırası hakkında asla varsayımlarda bulunmamalısınız.

var objSorted = {}
sortable.forEach(function(item){
    objSorted[item[0]]=item[1]
})

24
"Anahtarları sıralamak ve nesneden değerleri çekmek için dizi kullanabilirsiniz" için "yeniden inşa edebilirsiniz" için yeniden biçimlendirebilir misiniz? Sadece standart değil, sizin de belirttiğiniz gibi, bu hatalı varsayım bugün sadece Chrome'dan daha fazla tarayıcı tarafından kırılıyor, bu yüzden kullanıcıları denemeye teşvik etmemek daha iyi.
Oleg V.Volkov

32
Kodunuzun daha kompakt bir sürümü. Object.keys (maxSpeed) .sort (işlev (a, b) {return - (maxSpeed ​​[a] - maxSpeed ​​[b])});
TheBrain

6
@TheBrain: Sadece eklemek gerekirse keys(), sadece IE9 + (ve diğer modern tarayıcılar) tarafından desteklenir, eğer endişe varsa. Ayrıca keys(), prototip zincirindeki numaralandırılabilir özellikleri hariç tutar (bunun için .. in aksine) - ama bu genellikle daha arzu edilir.
MrWhite

31
_.pairsbir nesneyi [[anahtar1, değer1], [anahtar2, değer2]] haline getirir. Sonra buna sıralamayý söyle. Sonra _.objectgeri çevirmek için çağırın .
Funkodebat

2
Projem, düzgün bir şekilde birleştirmek için nesne anahtarları gerektirir, ancak meta veriler kullanıcı arabirimi kullandıkça açık sıralama gerektirir. Benzer bir yaklaşımı izledim, sadece prototip zincirini taramaktan kaçınmak için bir hasOwnProperty kontrolü ekledim. İşte JS hackernoon.com/… 'da
Nathan Agersea

416

Tüm veri yapısını çoğaltmak veya ilişkilendirilebilir bir diziye ihtiyaç duyduğumuz bir dizi kullanmak istemiyoruz.

İşte bonna ile aynı şeyi yapmanın başka bir yolu:

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


22
Bu, değere göre değil, anahtarla sıralama gibi görünüyor, sorunun sorulması gereken şey bu değil mi?
Michael

27
Değere göre sıralanır ve tuşları görüntüler - ancak yazdırıldığında, yalnızca tuşları yazdırdığı için değer sayısını kaybederiz.
Hanna

6
Nesne özellik sırası JavaScript'te garanti edilmez, bu nedenle sıralama bir nesneye değil bir diziye yapılmalıdır ('ilişkilendirilebilir dizi' olarak adlandırdığınız şeydir).
Christopher Meyers

6
Unutma. keysSortedbir dizi! Nesne değil!
Yeşil

17
.map(key => list[key]);Sıralamanın sonuna eklerseniz , sadece anahtar yerine tüm nesneyi döndürür
James Moran

184

Nesneleriniz herhangi bir miktarda özelliğe sahip olabilir ve nesneleri bir diziye koyarsanız istediğiniz nesne özelliğine, sayıya veya dizeye göre sıralamayı seçebilirsiniz. Şu diziyi düşünün:

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'
    }
];

doğum tarihine göre sırala, en eskisi

// 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);

isme göre sırala

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/


1
Ada göre sıralama substrilk karakteri içermemelidir ; başka Dianave Debratanımsız bir sipariş var. Ayrıca, byDatetürünüz aslında kullanır num, kullanmaz born.
Lawrence Dol

Bu iyi görünüyor, ancak dizeleri karşılaştırmak için kullanabileceğinizi unutmayınx.localeCompare(y)
Jemar Jones

2
@JemarJones localCompareçok kullanışlı bir fonksiyona benziyor! IE 10 ve daha az, Safari Mobile 9 ve daha az olmak üzere her tarayıcıda desteklenmeyeceğini unutmayın.
inorganik

@inorganik Evet, bu tarayıcıları desteklemesi gerekenler için çok iyi bir not
Jemar Jones

1
Bu, OP'nin istediği Nesneler dizisidir (çeşitli özelliklere sahip bir Nesne)
João Pimentel Ferreira

62

Tamlık uğruna, bu işlev nesne özelliklerinin sıralı dizisini döndürür :

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}]

Yukarıdaki kod ile Jsfiddle burada . Bu çözüm bu makaleye dayanmaktadır .

Dizeleri sıralamak için güncellenmiş keman burada. Büyük / küçük harfe duyarlı dize karşılaştırması için her iki ek .toLowerCase () dönüşümünü de kaldırabilirsiniz.


1
Bir Nesne dizisine ne dersiniz? [{name: Will}, {name: Bill}, {name: Ben}]
Hancock

1
Merhaba Will, bu karşılaştırma için localeCompare işlevini kullanabilirsiniz . Yukarıdaki cevaba ekledim.
Stano

Harika bir çözüm. Dize sıralama bir dönüş gerekiyor
pfwd

@Stano Doğru ve basit bir çözüm. Çok teşekkürler.
Abrar Hossain

49

ECMAScript 2017 tanıtıldı Object.values / Object.entries. Adından da anlaşılacağı gibi, ilki bir nesnenin tüm değerlerini bir diziye toplar ve ikincisi tüm nesneyi bir dizi dizisine dönüştürür [key, value]; Python dict.values()ve ile eşdeğerdir dict.items().

Özellikler, herhangi bir karmayı sıralı bir nesneye sıralamayı oldukça kolaylaştırır. Şu an itibariyle, JavaScript platformlarının yalnızca küçük bir kısmı bunları destekliyor , ancak Firefox 47+ üzerinde deneyebilirsiniz.

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]]

bu sorunun başlığını nasıl cevaplar Sorting JavaScript Object by property value? bence soruyu yanlış anladınız, çünkü orijinal Nesneyi değiştirecek ve ondan yeni bir Dizi oluşturmayacaksınız.
vsync

2
@vsync Bu yanıt, kabul edilen yanıtla aynı sonucu verir, ancak daha az kodla ve geçici değişken olmadan.
Darren Cook

3
FWIW, bu cevap temiz ve bana yardımcı olan tek cevap.
NetOperator Wibby

sadece ff'de, yani yani kromda artık nesneleri otomatik olarak sıralamazlar. wtf
fb

Bunun anahtarları korumayacağını unutmayın.
Vael Victus

40

@MarcusR'un referans için cevabının "oklu" versiyonu

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

GÜNCELLEME: Nisan 2017 - Bu, myObjyukarıda tanımlanan sıralanmış bir nesneyi döndürür .

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

Burada deneyin!

GÜNCELLEME: Ekim 2018 - Object.entries sürümü

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

Burada deneyin!


1
için çalışmıyorvar myObj = {"1": {"Value": 40}, "2": {"Value": 10}, "3": {"Value": 30}, "4": {"Value": 20}};
Rohanil

5
OP'nin sorusu, bu cevapla birlikte iç içe nesneler içermiyor @Rohanil Belki aşağı oylama yerine başka bir soru sormak istersiniz. Çeşitli türlere sahip iç içe nesnenizin açıkçası bu çözümden daha fazlasına ihtiyacı var
Jason J. Nathan

Sadece bir not: güncellemeleriniz gerçekten çalışmaz. En azından her yerde değil, yüzünden değil entries. Standarda göre, bir nesne sıralanmamış bir özellik koleksiyonudur . Bu, yeni nesneyi özellik değerine veya başka bir şeye göre sıraladıktan sonra oluşturmaya çalışıyorsanız, özellik anahtarı sıralamasının tekrar tanımsız hale geldiği anlamına gelir. Örneğin, Chrome varsayılan olarak özellik anahtarlarını sipariş etmektir, bu nedenle bunları farklı şekilde sipariş etme girişimleri işe yaramaz. Tek şansınız, sipariş tercihlerinize göre bir "indeks" elde etmek ve orijinal nesneyi buna göre hareket ettirmektir.
ZorgoZ

Evet @ZorgoZ, haklısın ve birçok kişi bu yayında bahsetti. Çoğu zaman, bu işlevi başka bir türe (JSON gibi) dönüştürmeden önce veya başka bir azaltma işlevinden önce bir dönüşüm olarak kullanırız. Amaç nesneyi daha sonra mutasyona uğratmaksa, beklenmedik sonuçlar ortaya çıkabilir. Motorlarda bu işlevle başarılı oldum.
Jason

Not: sort()Üzerinde kullanmak istemezsinizObject.entries()
Solvitieg

36

JavaScript nesneleri tanım gereği sıralanmamıştır (bkz. ECMAScript Dil Spesifikasyonu , bölüm 8.6). Dil belirtimi, bir nesnenin özelliklerini arka arkaya iki kez tekrarlarsanız, ikinci kez aynı sırayla çıkacaklarını garanti etmez.

Sipariş edilecek şeylere ihtiyacınız varsa, bir dizi ve Array.prototype.sort yöntemini kullanın.


4
Bu konuda biraz tartışmanın olduğunu unutmayın. Çoğu uygulama listeyi öğelerin eklendiği sırada tutar. IIRC, Chrome desteklemiyor. Chrome'un diğer uygulamalarla aynı doğrultuda olup olmayacağı konusunda bir tartışma vardı. İnancım, bir JavaScript nesnesinin bir karma olduğu ve herhangi bir siparişin kabul edilmemesi gerektiğidir. Python'un da aynı argümanı yaşadığını ve yakın zamanda yeni bir karma benzeri liste eklendiğini düşünüyorum. Çoğu tarayıcıda, nesnenizi yeniden yaratarak, sıralanan değere göre öğeler ekleyerek istediğinizi yapabilirsiniz. Ama yapmamalısın.
Nosredna

Düzenle. Chrome genellikle düzeni korur, ancak her zaman kabul etmez. İşte ilgili Chromium hatası: code.google.com/p/chromium/issues/detail?id=883
Nosredna

6
Bu hata raporu haksızdır ve belgelenmemiş davranışa güvenenler böceklerdir. ECMASCript bölüm 8.6'yı okuyun; "Bir Nesnenin, özelliksiz bir özellik koleksiyonu olduğunu" belirtir. Birkaç uygulamada böyle görünmediğini fark eden ve daha sonra bu uygulamaya özgü davranışa bağlı olmaya başlayan, büyük bir hata yaptı ve suçu kendilerinden uzaklaştırmaya çalışmamalıdır. Chrome ekibindeydim, bu hata raporunu "Geçersiz, WontFix" olarak işaretlerdim.
NickFitz

8
EcmaScript 5, numaralandırma sırasını ekleme sırası olarak tanımlar - tanımın olmaması ES3'te spesifik bir hata olarak kabul edilir. EcmaScript spesifikasyonunun kimsenin aklına gelmeyeceğini düşündüğü davranışı tanımladığını belirtmek gerekir - örneğin spec davranışı, sözdizimi hatalarının çoğu zaman çalışma zamanında atıldığı, devam etmenin yanlış kullanımı, break, ++, -, const, vb. bu koda ulaşmadan önce bir istisna fırlatan herhangi bir motor yanlış
olliej

4
@olliej - Bunun doğru olduğunu düşünmüyorum. Spesifikasyon şöyle diyor: "Özelliklerin numaralandırılmasının mekaniği ve sırası (ilk algoritmada adım 6.a, ikinci adım adım a) belirtilmedi". Bu, son taslağın PDF'inin 92. sayfasındadır.
whitneyland

25

Tamam , bildiğiniz gibi, javascript dizileri sıralamak için sort () işlevine sahiptir , ancak nesne için hiçbir şey yoktur ...

Bu durumda, bir şekilde anahtar dizisini almalı ve sıralamalıyız, bu yüzden apis'ler size çoğu zaman bir dizideki nesneleri verir, çünkü Array onlarla oynamak için nesne değişmezinden daha fazla yerel işlevlere sahiptir, hızlı solotion nesne anahtarları bir dizi döndüren Object.key kullanıyor , aşağıda sizin için işi yapan ES6 işlevini oluşturmak, javascript yerel sort () ve reduce () işlevlerini kullanır :

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

Ve şimdi şöyle kullanabilirsiniz:

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

SortMyObject öğesini kontrol edin ve sonucu aşağıdaki gibi tuşlara göre sıralanmış olarak görebilirsiniz:

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

Ayrıca bu şekilde ana nesneye dokunulmaz ve aslında yeni bir nesne elde ederiz.

Ayrıca, aşağıdaki gibi çalıştırarak işlev adımlarını daha net hale getirmek için aşağıdaki görüntüyü oluşturuyorum:

Javascript nesnesini özellik değerine göre sıralama


4
Bu sıralama, değere göre değil, anahtarla sıralanır.
ROROROOROROR

@ROROROOROROR, sadece farklı olmadıkları için nasıl çalıştığının bir göstergesi, ama hepsi iyi, ben de değere göre sıralama ekleyeceğim
Alireza

1
Değere göre sıralama yanlış ve veri kümeniz. Değişim c: 3için c: 13ve sizin hiç ayrılacak göreceksiniz.
VtoCorleone

1
@VtoCorleone Bu doğal bir sıralama hatasıdır, ilk önce 1 gelir, algoritmada sunulan şekliyle bir kusur değil.
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}

Basit ve Mükemmel! Bu soruya cevap verir. Teşekkürler.
Ajay Singh

Javascript anahtar sırası garanti edilmez, bu yüzden anahtarlar tamsayı veya benzeri ise bu benim için başarısız
ParoX

tam, ParoX. Anahtar tamsayı türü olduğunda bu düzgün çalışmaz.
jungwon jin

8

ES6 ile güncelleme: Endişeniz yinelenecek sıralanmış bir nesneye sahipse (bu yüzden nesne özelliklerinizin sıralanmasını istediğinizi hayal ediyorum), Harita nesnesini kullanabilirsiniz .

(Anahtar, değer) çiftlerinizi sıralı olarak ekleyebilirsiniz ve daha sonra bir for..ofdöngü yapmanız , onları eklediğiniz sırayla döngüye almayı garanti eder

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

Ayrıca ES6 (ES2015): Nesne özellikleri do düzen var (ya da belirlenen bir sırada bunları erişen sizin bakış bağlı bir araç yoktur). Özellik adları dizelerse ve dizi dizinleri gibi görünmüyorsa, sıra, nesneye eklendikleri sıradır. Bu emir edilir değil saygı göstereceği belirtilen for-inveya Object.keysancak edilmektedir tarafından saygı görmek tanımlı Object.getOwnPropertyNamesözellik adı diziler erişmek için ve diğer yeni yöntemler. Yani bu başka bir seçenek.
TJ Crowder

Fakat `` sıralama '' operasyonu nerede? Bunlar hiç sıralanmamış
Yeşil

@Yeşil, burada vurgulamak istediğim şey, Mapaslında, sıralı düzende saklayabileceğiniz bir veri yapınız olduğu (verilerinizi sıralayın, döngü yapın ve haritada saklayın). itiraz ediyor.
julianljk

6

Gelişmiş dizi veya nesne türleri için Underscore.js veya Lodash.js

 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);

gösteri


6

Çok kısa ve basit!

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

5

Slebetman tarafından verilen çözümü takip ediyorum (tüm detaylar için okuyun), ancak nesneniz iç içe olmadığından ayarlandı.

// 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
}

4

Birden çok döngüye sahip olmayan değerleri sırala (anahtarlara göre sıralamak için, geri arama dizinindeki dizini "0" olarak değiştirin)

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) 


2

Bu, gerçek sıralı bir nesne olarak ele almanın basit bir yolu olabilir. Ne kadar yavaş olduğundan emin değilim. bir while döngüsü ile daha iyi olabilir.

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

}

Ve sonra bu ters çevirme işlevini şu adresten buldum: 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;
};

Yani

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)

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
   } , [])

çıktı = [{p: 8}, {c: 2}, {b: 1}, {g: 1}]


2

Her ihtimale karşı, birisi @Markus R ve @James Moran yorumunun kod referansını kullanarak nesneyi (anahtarlar ve değerlerle birlikte) arıyor, sadece şunu kullanın:

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}

2
Bir ödevi geri mapforEach
gönderiyorsunuz

2
let toSort = {a:2323, b: 14, c: 799} 
let sorted = Object.entries(toSort ).sort((a,b)=> a[1]-b[1]) 

Çıktı:

[ [ "b", 14 ], [ "c", 799 ], [ "a", 2323 ] ]

1

birçok benzer ve kullanışlı fonksiyon: 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;
}

1

Nesne değere göre sıralanmış (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;
}

1

İşte bir örnek daha:

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);


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 }

1

daktilo ile yazılmış yazı

Aşağıdaki işlev nesneyi değere veya değerin bir özelliğine göre sıralar. TypeScript kullanmıyorsanız, tür bilgisini JavaScript'e dönüştürmek için kaldırabilirsiniz.

/**
 * 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);
}

kullanım

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);

Bir JavaScript nesnesindeki anahtarların sırası garanti edilmez, bu yüzden sonucu sıralıyorum ve Map sıralama düzenini koruyan nesne .

Bunu tekrar Object'e dönüştürmek istiyorsanız, bunu yapabilirsiniz:

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

1

girdi nesne, çıktı nesne, lodash & js yerleşik lib kullanarak, azalan veya artan seçenek ile ve giriş nesnesini değiştirmez

örneğin giriş ve çıkış

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

Hayata geçirme

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));

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;
    });

1

sıralama ile benim çözüm:

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]);
}

Lütfen kodunuzu kod olarak biçimlendirin
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>

1
Stackoverflow'a hoş geldiniz. Verdiğiniz yanıta ek olarak, lütfen bunun neden ve nasıl sorunu çözdüğüne dair kısa bir açıklama sağlayın.
jtate

0

Bunu çözmenin başka bir yolu: -

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 sonuç dizisine sahip olacak


0

Teşekkürler ve devam etmek cevap @Nosredna

Şimdi nesnenin diziye dönüştürülmesi gerektiğini anladığımıza göre diziyi sıralayın. diziyi (veya dönüştürülen nesneyi diziye) dizeye göre sıralamak için kullanışlıdır:

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

0

Bunu dene. Nesneniz bile sıralamaya çalıştığınız özelliğe sahip olmadığında da işlenir.

Nesneyle özellik göndererek arayın.

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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.