node.jsで辞書型はvalueに配列があるとソートできない
// フルーツの価格と重さ。
var fruits = [
{name:"apple",price:100,weight:90},
{name:"mango",price:500,weight:200},
{name:"orange",price:98,weight:150},
{name:"apple",price:100,weight:100},
{name:"banana",price:50,weight:50},
{name:"melon",price:500,weight:500},
{name:"mango",price:398,weight:200}
]
//重さ、価格、の順に並び替え(降順)
fruits.sort(function(a,b){
if(a.weight>b.weight) return -1;
if(a.weight<b.weight) return 1;
if(a.price>b.price) return -1;
if(a.price < b.price) return 1;
return 0;
});
結果
[ { name: 'melon', price: 500, weight: 500 },
{ name: 'mango', price: 500, weight: 200 },
{ name: 'mango', price: 398, weight: 200 },
{ name: 'orange', price: 98, weight: 150 },
{ name: 'apple', price: 100, weight: 100 },
{ name: 'apple', price: 100, weight: 90 },
{ name: 'banana', price: 50, weight: 50 } ]
引用元:https://qiita.com/PianoScoreJP/items/f0ff7345229871039672
リストを含む辞書型の場合
例えば以下をvalueの長さでソートしたい場合・・・
var items= {'fruits': ['apple', 'grape'], 'sweets':['chocolate', 'windows'], 'OS':['windows', 'android', 'iOS'], 'empty':[]}
・・・ソート方法は見つかりませんでした。
var items= {'fruits': ['apple', 'grape'],
'sweets':['chocolate', 'windows'],
'OS':['windows', 'android', 'iOS'],
'empty':[]}
const result = []
const resultSorted = {}
for (let key in items) {
result.push([key,items[key]])
}
result.sort(function(a, b) {
return b[1].length - a[1].length
})
result.forEach(function(item){
resultSorted[item[0]]=item[1]
})
console.log(resultSorted)
//{
// OS: [ 'windows', 'android', 'iOS' ],
// fruits: [ 'apple', 'grape' ],
// sweets: [ 'chocolate', 'windows' ],
// empty: []
//}
辞書型⇛無理やり配列化⇛ソート⇛その順番で辞書型に戻すという方法をとっています・・・。(無念)
色々探し回ったけど諦めました。(辞書型の形が色々あるけど名前がないから探すのがしんどかった・・・配列in辞書型とか辞書型in配列とか名前がほしいです。)
Stack Over Flowの外人ニキの答えは無理やりソートする手法をベストアンサーにされていたのを参考にコードを書いています。
コメントを残す