按 3 列排序功能列表并通过修改启动它

Function sorting list by 3 columns and initiating it with a modification

我有一个 table 需要排序。它目前有 3 列:

货币Td |帐号编号 |复选框Td

我想先按货币排序,然后按复选框(勾选到顶部)最后按帐号排序。但是,还需要进行一项修改 - 初始加载时,具有特定货币 ("PLN") 的行应显示在 table 的顶部。之后,所有剩余的行都应正常排序。

我使用 list.js 对行进行排序。我写了下面的排序函数:

const options = {
        valueNames: ['currencyTd', 'accountNoTd', 'checkboxTd']
    };

    const accountsList = new List('accountsList', options);

    accountsList.sort('currencyTd', {
        order: 'asc',            
        sortFunction: function (a, b) {  
            if ((a.currencyTd === 'PLN') != (b.currencyTd === 'PLN')) {
                return a.currencyTd === 'PLN' ? 1 : -1;
            }
            return a.currencyTd > b.currencyTd ? 1 :
                   a.currencyTd < b.currencyTd ? -1 : 0;
        }

    });

但它没有按我预期的方式工作。我可能做错了什么?

编辑:我忘了添加 - 我此时编写的当前函数(如上面的代码中所示)应该仅按货币列对其进行排序。当我实现它时,我想按其他列添加排序。

您可以对所有排序条件使用链式方法。

var array = [
        { currencyTd: 'DEF', accountNoTd: 2, checkboxTd: 0 },
        { currencyTd: 'ABC', accountNoTd: 2, checkboxTd: 1 },
        { currencyTd: 'PLN', accountNoTd: 2, checkboxTd: 1 },
        { currencyTd: 'ABC', accountNoTd: 2, checkboxTd: 0 },
        { currencyTd: 'PLN', accountNoTd: 3, checkboxTd: 0 },
        { currencyTd: 'DEF', accountNoTd: 2, checkboxTd: 1 },
        { currencyTd: 'DEF', accountNoTd: 3, checkboxTd: 0 },
        { currencyTd: 'PLN', accountNoTd: 3, checkboxTd: 1 },
        { currencyTd: 'ABC', accountNoTd: 1, checkboxTd: 0 },
        { currencyTd: 'ABC', accountNoTd: 1, checkboxTd: 1 },
        { currencyTd: 'PLN', accountNoTd: 2, checkboxTd: 0 },
        { currencyTd: 'PLN', accountNoTd: 1, checkboxTd: 0 },
        { currencyTd: 'ABC', accountNoTd: 3, checkboxTd: 1 },
        { currencyTd: 'DEF', accountNoTd: 1, checkboxTd: 0 },
        { currencyTd: 'ABC', accountNoTd: 3, checkboxTd: 0 },
        { currencyTd: 'DEF', accountNoTd: 1, checkboxTd: 1 },
        { currencyTd: 'PLN', accountNoTd: 1, checkboxTd: 1 },
        { currencyTd: 'DEF', accountNoTd: 3, checkboxTd: 1 }
    ];

array.sort(function (a, b) {
    return (
        (a.currencyTd !== 'PLN') - (b.currencyTd !== 'PLN') || // sort PLN to top
        a.currencyTd.localeCompare(b.currencyTd) ||            // sort currencyTd ASC
        a.accountNoTd - b.accountNoTd ||                       // sort accountNoTd ASC
        a.checkboxTd - b.checkboxTd                            // sort checkboxTd ASC
    );
});
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }