簡體   English   中英

排序嵌套對象數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM