Çocuklar mecazi olarak şok oldum! Elbette tüm cevaplar biraz eski, ama kimse sıralamadaki istikrardan bile bahsetmedi! Öyleyse bana sor, sorunun kendisine cevap vermek ve burada ayrıntılara girmek için elimden geleni yapacağım. Şimdi özür dileyeceğim şimdi okuyacak çok şey olacak.
2018 olduğundan sadece ES6 kullanacağım, Çoklu Doldurmaların tümü, verilen bölümde bağlayacağım MDN belgelerinde mevcuttur.
Sorunun cevabı:
Anahtarlarınız yalnızca rakamsa , sıralanan nesneyi döndürmek için Object.keys()
ile birlikte güvenle kullanabilirsiniz Array.prototype.reduce()
:
// Only numbers to show it will be sorted.
const testObj = {
'2000': 'Articel1',
'4000': 'Articel2',
'1000': 'Articel3',
'3000': 'Articel4',
};
// I'll explain what reduces does after the answer.
console.log(Object.keys(testObj).reduce((accumulator, currentValue) => {
accumulator[currentValue] = testObj[currentValue];
return accumulator;
}, {}));
/**
* expected output:
* {
* '1000': 'Articel3',
* '2000': 'Articel1',
* '3000': 'Articel4',
* '4000': 'Articel2'
* }
*/
// if needed here is the one liner:
console.log(Object.keys(testObj).reduce((a, c) => (a[c] = testObj[c], a), {}));
Ancak dizeleri ile çalışıyorsanız Array.prototype.sort()
tüm bunların içine zincirleme tavsiye ederim :
// String example
const testObj = {
'a1d78eg8fdg387fg38': 'Articel1',
'z12989dh89h31d9h39': 'Articel2',
'f1203391dhj32189h2': 'Articel3',
'b10939hd83f9032003': 'Articel4',
};
// Chained sort into all of this.
console.log(Object.keys(testObj).sort().reduce((accumulator, currentValue) => {
accumulator[currentValue] = testObj[currentValue];
return accumulator;
}, {}));
/**
* expected output:
* {
* a1d78eg8fdg387fg38: 'Articel1',
* b10939hd83f9032003: 'Articel4',
* f1203391dhj32189h2: 'Articel3',
* z12989dh89h31d9h39: 'Articel2'
* }
*/
// again the one liner:
console.log(Object.keys(testObj).sort().reduce((a, c) => (a[c] = testObj[c], a), {}));
Birisi azaltmanın ne yaptığını merak ediyorsa:
// Will return Keys of object as an array (sorted if only numbers or single strings like a,b,c).
Object.keys(testObj)
// Chaining reduce to the returned array from Object.keys().
// Array.prototype.reduce() takes one callback
// (and another param look at the last line) and passes 4 arguments to it:
// accumulator, currentValue, currentIndex and array
.reduce((accumulator, currentValue) => {
// setting the accumulator (sorted new object) with the actual property from old (unsorted) object.
accumulator[currentValue] = testObj[currentValue];
// returning the newly sorted object for the next element in array.
return accumulator;
// the empty object {} ist the initial value for Array.prototype.reduce().
}, {});
Gerekirse burada bir astar için açıklama:
Object.keys(testObj).reduce(
// Arrow function as callback parameter.
(a, c) =>
// parenthesis return! so we can safe the return and write only (..., a);
(a[c] = testObj[c], a)
// initial value for reduce.
,{}
);
Sıralama neden biraz karmaşık:
Kısacası Object.keys()
, normal bir döngü ile elde ettiğimiz sırayla bir dizi döndürür:
const object1 = {
a: 'somestring',
b: 42,
c: false
};
console.log(Object.keys(object1));
// expected output: Array ["a", "b", "c"]
Object.keys (), öğeleri doğrudan nesne üzerinde bulunan numaralandırılabilir özelliklere karşılık gelen dizeler olan bir dizi döndürür. Özelliklerin sırası, nesnenin özellikleri üzerinde elle döngü yapılarak verilenle aynıdır.
Sidenote - Dizilerde de kullanabilirsiniz Object.keys()
, dizinin döndürüleceğini unutmayın:
// simple array
const arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']
Ancak bu örneklerde gösterildiği gibi kolay değildir, gerçek dünya nesneleri sayılar ve alfabetik karakterler veya hatta semboller içerebilir (lütfen yapmayın).
Hepsi tek bir nesnede olan bir örnek:
// This is just to show what happens, please don't use symbols in keys.
const testObj = {
'1asc': '4444',
1000: 'a',
b: '1231',
'#01010101010': 'asd',
2: 'c'
};
console.log(Object.keys(testObj));
// output: [ '2', '1000', '1asc', 'b', '#01010101010' ]
Şimdi Array.prototype.sort()
yukarıdaki dizide kullanırsak , çıktı değişir:
console.log(Object.keys(testObj).sort());
// output: [ '#01010101010', '1000', '1asc', '2', 'b' ]
İşte dokümanlardan bir alıntı:
Sort () yöntemi, bir dizinin öğelerini yerinde sıralar ve diziyi döndürür. Sıralama mutlaka sabit değildir. Varsayılan sıralama düzeni Unicode kod noktalarına göre yapılır.
Bu türün zaman ve mekan karmaşıklığı, uygulamaya bağlı olduğu için garanti edilemez.
Bunlardan birinin sizin için istenen çıktıyı verdiğinden emin olmalısınız. Gerçek hayattaki örneklerde, API'lar ve Veritabanları gibi farklı bilgi girişlerini birlikte kullanırsanız, insanlar özel olarak işleri bir araya getirme eğilimindedir.
Peki önemli olan ne?
Her programcının anlaması gereken iki makale var:
Yerinde algoritma :
Bilgisayar biliminde, yerinde algoritma, yardımcı veri yapısı olmadan girişi dönüştüren bir algoritmadır. Ancak yardımcı değişkenler için az miktarda ekstra depolama alanına izin verilir. Algoritma yürütülürken giriş genellikle çıktı tarafından yazılır. Yerinde algoritma, giriş sırasını yalnızca öğelerin değiştirilmesi veya değiştirilmesi yoluyla günceller. Yerinde olmayan bir algoritmaya bazen yerinde değil veya yerinde değil denir.
Yani temelde eski dizimizin üzerine yazılacak! Eski diziyi başka nedenlerle korumak istiyorsanız bu önemlidir. Bunu aklınızda bulundurun.
Sıralama algoritması
Kararlı sıralama algoritmaları, özdeş öğeleri girişte göründükleri sırayla sıralar. Bazı veri türlerini sıralarken, sıralama düzenini belirlerken verilerin yalnızca bir kısmı incelenir. Örneğin, sağdaki kart sıralama örneğinde, kartlar sıralarına göre sıralanır ve takımları yoksayılır. Bu, orijinal listenin doğru şekilde sıralanmış birden fazla farklı versiyonuna olanak tanır. Kararlı sıralama algoritmaları, bunlardan birini aşağıdaki kurala göre seçer: iki öğe, iki 5 kart gibi eşit olarak karşılaştırılırsa, göreli sıraları korunur, böylece girişte biri diğerinden önce gelirse, aynı zamanda çıktıda diğerinden önce gelir.
Oyun kartlarında kararlı sıralama örneği. Kartlar kararlı bir sıralama ile sıralamaya göre sıralandıklarında, iki 5'lerin başlangıçta oldukları sıralı çıkışta aynı sırada kalmaları gerekir. Kararlı olmayan bir sıralamada sıralandıklarında, 5'ler ters yönde bitebilir sıralı çıktıda sırala.
Bu, sıralamanın doğru olduğunu ancak değiştiğini gösterir. Bu yüzden gerçek dünyada sıralama doğru olsa bile beklediğimizden emin olmalıyız! Bu çok önemlidir, bunu aklınızda bulundurun. Daha fazla JavaScript örneği için Array.prototype.sort () - dokümanlarına bakın: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort