簡體   English   中英

在Javascript中按多個屬性對對象數組進行排序

[英]Sort array of objects by multiple properties in Javascript

我整天都在閱讀類似的帖子,但不知道如何按多個屬性對我的 javascript 數組進行排序。 我的數組有一個“名稱”和“類型”屬性。 要按名稱排序,我現在使用:

                byNameDesc.sort(function (a, b) {
                    var x = a.name.toLowerCase();
                    var y = b.name.toLowerCase();
                    return y < x ? -1 : y > x ? 1 : 0;
                });

效果很好。 我想增強這個功能。 如果 'name' 是 'foo' 它應該總是在頂部。 而且我還想按“類型”排序。 所以'foo'應該總是在最前面,然后按'name'和'type'排序。

我試過這個:

                byNameDefault.sort(function (a, b) {
                    if (a.name == 'foo') {
                        return -1;
                    }
                    var x = a.type.toLowerCase();
                    var y = b.type.toLowerCase();
                    return x < y ? -1 : x > y ? 1 : 0;
                });

但這沒有用。

而且我不知道如何按“名稱”和“類型”排序。

任何幫助深表感謝。

對於多個排序標准,您從第一個標准繼續到最后一個標准:如果一個標准的兩個條目不相等,您可以從排序函數返回結果為 -1 或 1。此外,在最后一個標准中,您還可以返回 0兩個相等的輸入。

這是您的案例的示例實現:

byNameDefault.sort(function (a, b) {
    // compare names
    var na = a.name.toLowerCase();
    var nb = b.name.toLowerCase();

    if (na !== nb) {
        if (na === 'foo')
            return -1;
        else if (nb === 'foo')
            return 1;
        else
            return na < nb ? -1 : 1;
    } 

    // compare types
    return a.type < b.type ? -1 : a.type > b.type ? 1 : 0; 
}

在一個表達式中執行此操作,其中不同的組件用||組合。 ; 只有當一個部分評估為 0 時,下一個才會起作用:

byNameDefault.sort(function (a, b) {
    return (b === 'foo') - (a == 'foo') || 
           a.name.localeCompare(b.name) ||
           a.type.localeCommpare(b.type); 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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