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
I'm looking for any alternatives to the below for creating a JavaScript array containing 1 through to N where N is only known at runtime. var foo = []; for (var

do N times (declarative syntax)
Is there a way in Javascript to write something like this easily: .times do { something(); } Any library that might support some similar syntax maybe? Update: t
コメント