[英]Sort array of nested objects
我需要對嵌套對象的數組進行排序。 我編寫了以下代碼,但是由於某些原因,即使第一個元素不應該將其始終放置在返回數組中。
orderedArray = () => {
let sortedArray = products
if(this.state.interests.design && this.state.interests.code && this.state.interests.business)
sortedArray.sort((a,b)=> (b.scores.quality-a.scores.quality))
else if(this.state.interests.design && this.state.interests.code)
sortedArray.sort((a,b) => (b.scores.quality*b.scores.relevancy.code*b.scores.relevancy.design/2)-(a.scores.quality*a.scores.relevancy.code*a.scores.relevancy.design/2))
else if(this.state.interests.design && this.state.interests.business)
sortedArray.sort((a,b) => (b.scores.quality*b.scores.relevancy.business*b.scores.relevancy.design/2)-(a.scores.quality*a.scores.relevancy.business*a.scores.relevancy.design/2))
else if(this.state.interests.business && this.state.interests.code)
sortedArray.sort((a,b) => (b.scores.quality*b.scores.relevancy.business*b.scores.relevancy.code/2)-(a.scores.quality*a.scores.relevancy.business*a.scores.relevancy.code/2))
else if(this.state.interests.business)
sortedArray.sort((a,b)=> (b.scores.quality*b.scores.relevancy.business-a.scores.quality*a.scores.relevancy.busines))
else if(this.state.interests.code)
sortedArray.sort((a,b)=> (b.scores.quality*b.scores.relevancy.code-a.scores.quality*a.scores.relevancy.code))
else if(this.state.interests.design)
sortedArray.sort((a,b)=> (b.scores.quality*b.scores.relevancy.design-a.scores.quality*a.scores.relevancy.design))
console.log(JSON.stringify(sortedArray))
return sortedArray
}
想法是,如果他們選擇設計,業務和代碼,則結果數組應按質量排序,否則將質量和所選變量混合在一起。 數據如下:
[
{
"name":"dasd",
"scores": {
"quality": 8,
"relevancy": {
"design": 3,
"code": 9,
"business": 5
}
},
{...}
}
{...}
]
而this.state
是:
this.state = {
minutes: int,
interests: {
business: bool,
code: bool,
design: bool
}
}
使用公式無法對多個屬性上的數組進行排序。
給定一系列具有{name:'Alice', age:8, grades:{math:12, gym:14}}
這樣的結構的“學生”對象,以下各項將不起作用:
// This does not sort by math then gym, it sorts by the result of their products, which is meaningless
students.sort((a,b) => (a.grades.math*a.grades.gym - b.grades.math*b.grades.gym))
正如您在此Q / A中所看到的 ,很難在JS中實現,但是有一些庫可以使這一點變得非常簡單,例如下划線或lodash 。
使用lodash,您可以執行以下操作:
// This sorts by math score, then gym score
_.sortBy(students, [s => s.grades.math, s => s.grades.gym])
現在,在沒有給出完整解決方案的情況下解決您的問題,這里提示:
var data = [...];
var propertiesToSortBy = [ o => o.scores.quality ];
// Your rules below
if (...) {
propertiesToSortBy = [ o => o.scores.quality, o => o.scores.relevancy.business ];
}
else if (...) {
propertiesToSortBy = [ o => o.scores.relevancy.design, o => o.scores.relevancy.business ];
}
else ...
// Finally, sort
_.sortBy(data, propertiesToSortBy);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.