私は比喩的にショックを受けています!確かにすべての回答は少し古いですが、ソートの安定性については誰も言及していません!だから私と一緒に耐えてください、私は質問自体に答えて、ここで詳細に入るように最善を尽くします。大変お詫び申し上げます。
2018年なので、ES6のみを使用します。ポリフィルはすべて、MDNのドキュメントで入手できます。MDNのドキュメントは、所定の部分でリンクします。
質問への回答:
キーが数値のみの場合、とObject.keys()
一緒に安全に使用して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), {}));
ただし、文字列を使用している場合はArray.prototype.sort()
、このすべてにチェーンすることを強くお勧めします。
// 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), {}));
誰かが削減が何をするのか疑問に思っている場合:
// 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().
}, {});
必要に応じて、ここに1つのライナーの説明を示します。
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.
,{}
);
並べ替えが少し複雑な理由:
つまりObject.keys()
、通常のループで取得したのと同じ順序の配列を返します。
const object1 = {
a: 'somestring',
b: 42,
c: false
};
console.log(Object.keys(object1));
// expected output: Array ["a", "b", "c"]
Object.keys()は、要素がオブジェクトに直接ある列挙可能なプロパティに対応する文字列である配列を返します。プロパティの順序は、オブジェクトのプロパティを手動でループする場合と同じです。
サイドノート- Object.keys()
配列でも使用できます。インデックスが返されることに注意してください。
// simple array
const arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']
しかし、これらの例に示すほど簡単ではありません。実際のオブジェクトには、数字やアルファベット文字、さらには記号が含まれている場合があります(実行しないでください)。
これらはすべて1つのオブジェクトにある例です。
// 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' ]
ここArray.prototype.sort()
で、上記の配列で出力を変更すると、次のようになります。
console.log(Object.keys(testObj).sort());
// output: [ '#01010101010', '1000', '1asc', '2', 'b' ]
これはドキュメントからの引用です:
sort()メソッドは、配列の要素を所定の位置にソートし、配列を返します。ソートは必ずしも安定しているとは限りません。デフォルトのソート順は、文字列のUnicodeコードポイントに従います。
ソートの時間とスペースの複雑さは、実装に依存するため保証できません。
それらの1つが目的の出力を返すことを確認する必要があります。実際の例では、APIやデータベースなどの異なる情報入力を一緒に使用すると、人々は物事を特別に混同する傾向があります。
だから大したことは何ですか?
さて、すべてのプログラマが理解すべき2つの記事があります。
インプレースアルゴリズム:
コンピュータサイエンスでは、インプレースアルゴリズムは、補助データ構造を使用せずに入力を変換するアルゴリズムです。ただし、補助変数用に少量の追加のストレージスペースが許可されています。アルゴリズムが実行されると、通常、入力は出力によって上書きされます。インプレースアルゴリズムは、要素の置換または交換によってのみ入力シーケンスを更新します。インプレースではないアルゴリズムは、インプレースまたはアウトオブプレースと呼ばれることもあります。
したがって、基本的には古い配列が上書きされます!他の理由で古いアレイを保持したい場合、これは重要です。これを覚えておいてください。
並べ替えアルゴリズム
安定したソートアルゴリズムは、入力に現れるのと同じ順序で同一の要素をソートします。一部の種類のデータを並べ替える場合、並べ替え順序を決定するときにデータの一部のみが検査されます。たとえば、右側のカードソートの例では、カードはランクでソートされており、スートは無視されています。これにより、元のリストの複数の異なる正しくソートされたバージョンの可能性が可能になります。安定した並べ替えアルゴリズムは、次のルールに従ってこれらのいずれかを選択します。2つの5つのカードのように2つのアイテムが等しいと比較した場合、それらの相対的な順序は保持されるため、入力で一方が他方の前に来た場合も、出力で他の前に来る。
トランプの安定したソートの例。カードが安定したソートでランクによってソートされる場合、2つの5は、元々あったソートされた出力で同じ順序のままである必要があります。非安定なソートでソートされた場合、5は逆になります。ソートされた出力の順序。
これは、ソートが正しいことを示していますが、変更されています。したがって、現実の世界では、並べ替えが正しい場合でも、期待どおりの結果が得られることを確認する必要があります。これは非常に重要であり、これも覚えておいてください。その他のJavaScriptの例については、Array.prototype.sort()を調べてください -ドキュメント:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort