短い答え
new Map([...map].sort((a, b) =>
))
たとえば、等しい可能性のある値の文字列を比較する場合、[1]にアクセスし、0を返すequals条件を持つソート関数を渡します。
new Map([...map].sort((a, b) => (a[1] > b[1] && 1) || (a[1] === b[1] ? 0 : -1)))
等しくすることはできない(同一の文字列キーは互いに上書きする)キー文字列を比較すると、等しい条件をスキップできます。ただし、次の場合、レイジーa[0] > b[0]
を返すと誤ってfalse(0として扱われる、つまり等しい)になるため、明示的に-1を返す必要がありますa[0] < b[0]
。
new Map([...map].sort((a, b) => a[0] > b[0] ? 1 : -1))
例を挙げて詳細に
.entries()
中に[...map.entries()]
(多くの回答で提案されている)は、JSエンジンがあなたのために離れてそれを最適化していない限り、おそらくマップの余分な反復を追加し、冗長です。
単純なテストケースでは、質問が求めることを次のように実行できます。
new Map([...map].sort())
...キーは、すべての文字列である場合、などつぶれや強要コンマ参加し、キーと値の文字列を比較する'2-1,foo'
と'0-1,[object Object]'
、新しい挿入順序で新しい地図を返します:
注:{}
SOのコンソール出力にのみ表示される場合は、実際のブラウザコンソールを確認してください
const map = new Map([
['2-1', 'foo'],
['0-1', { bar: 'bar' }],
['3-5', () => 'fuz'],
['3-2', [ 'baz' ]]
])
console.log(new Map([...map].sort()))
ただし、このような強制と文字列化に依存することはお勧めできません。あなたは次のような驚きを得ることができます:
const map = new Map([
['2', '3,buh?'],
['2,1', 'foo'],
['0,1', { bar: 'bar' }],
['3,5', () => 'fuz'],
['3,2', [ 'baz' ]],
])
console.log('Buh?', new Map([...map].sort()))
for (const iteration of map) {
console.log(iteration.toString())
}
このようなバグはデバッグが非常に困難です。リスクを冒さないでください。
あなたは、キーまたは値をソートしたい場合は、それが明示的にそれらにアクセスするのが最善だa[0]
とb[0]
、このように、ソート機能に。我々は返す必要があることを注意-1
し、1
前用と後に、ではないfalse
か、0
生のようにa[0] > b[0]
等号として扱われているので:
const map = new Map([
['2,1', 'this is overwritten'],
['2,1', '0,1'],
['0,1', '2,1'],
['2,2', '3,5'],
['3,5', '2,1'],
['2', ',9,9']
])
const sortStringKeys = (a, b) => a[0] > b[0] ? 1 : -1
const sortStringValues = (a, b) => (a[1] > b[1] && 1) || (a[1] === b[1] ? 0 : -1)
console.log('By keys:', new Map([...map].sort(sortStringKeys)))
console.log('By values:', new Map([...map].sort(sortStringValues)))