プログラミング学習

JavaScriptのarray,objソートランキングObject.fromEntries(Object.entries(obj).sort())

プログラミング学習

JavaScriptのarrayやobjソートメモ書きです。

ランキングはスコアだけではないでしょうから、考え方としてはオブジェクトのソートでしょう。

Object.fromEntries(Object.entries(obj).sort())) 追加

objects.keyをソートする場合、この方法だと一行でいけますね。

Object.fromEntries(Object.entries({type2: 10, type3:1, type1:5}).sort())

Object.entriesでオブジェクトを配列化し、ソートした上でまたオブジェクトに変換する感じ。

スポンサーリンク

配列のソート(ランキング化)

配列をソートしようしたら次のエラーがでました。

sort is not a function

配列に統一感がなかったため、配列を統一してランキング化しました。

Obj {"type1":11,"type2":9,"type3":10}

scoreのobjでランキング化したい場合。

const array = Object.keys(obj).map((key) => {
  return { score: obj[key] }
})
array.sort((a, b) => {
  // return a.score - b.score // 昇順
  return b.score - a.score // 降順
})
console.log('ソート済', JSON.stringify(array))


純粋な配列でランキング化したい場合。

const array = Object.keys(obj).map((key) => {
  return obj[key]
})
array.sort((a, b) => {
  return b - a // 降順
})
console.log('ソート済', JSON.stringify(array))

JavaScriptは配列のソートする際、同値の場合はブラウザにより挙動が違うようなので、その対策も考慮する必要があります。return 0;する(読んだだけで詳しくは未検証)

スポンサーリンク

objのソート(別バージョン)

このobjをそのまま使いたい場合は次のようになります。

Obj {"type1":11,"type2":9,"type3":10}
const entries = Object.entries(obj)
const sorted = entries.sort((a, b) => b[1] - a[1]) // 降順

sortedObj = Object.fromEntries(sorted)
keys = Object.keys(sortedObj)
values = Object.values(sortedObj)

参考。

IT swarm

nodeのバージョンに制限がある場合、Object.fromEntriesは使えません。他の命令で代替が必要になったケースがありました。

const entries = Object.entries(obj)
const sorted = entries.sort((a, b) => b[1] - a[1]) // 降順

const sortedObj = Object.assign(
  ...sorted.map(([key, value]) => ({ [key]: value }))
)
スポンサーリンク

objectをn回文繰り返す

ソートしたオブジェクトからトップ3だけ抽出する場合などに便利です。

      Array.from({ length: 3 }, (_, i) => {
        console.log('3回数ぶん、繰り返す', _, i)
        const best3 = Object.keys(obj)[i]

        console.log('best3', best3)
      })


length: 3で3回分繰り返します。
_はすべてundefined。
iは0, 1, 2です。

{ length: 3 }だけの指定や_を省くと、すべてundefinedになります。

Rangeを使うやり方など、いろいろなやり方があります。

How to create an array containing 1...N
do N times (declarative syntax)

コメント

タイトルとURLをコピーしました