使用 lodash 按特定顺序对数组进行排序

时间:2021-03-10 13:11:47

标签: javascript lodash

我想根据以下条件对数组进行排序:

  1. 手动给定的参数
  2. 然后按 DESC 排序

这是数组

var ar = [
    [{'name' : 'b', 'val' : '1'}, {'name' : 'b', 'val' : '10'}], // 'name' are always the same
    [{'name' : 'a', 'val' : '2'}, {'name' : 'a', 'val' : '2'}],
    [{'name' : 'c'}, {'name' : 'c', 'val' : '100'}]
]

排序函数执行时:sortBy('a')

它应该返回我:

var ar = [
    [{'name' : 'a', 'val' : '2'}, {'name' : 'a', 'val' : '2'}], 
    [{'name' : 'c'}, {'name' : 'c', 'val' : '100'}]
    [{'name' : 'b', 'val' : '1'}, {'name' : 'b', 'val' : '10'}],
]

因为'a'是作为参数给出的,所以它有优先权。然后从Z到A排序。

解决方案应该写成 ES5(如果可能,使用 lodash)。

2 个答案:

答案 0 :(得分:2)

您可以尝试将顶部的一个与其他的不同以进行降序排序。

const
    sortBy = value => ([{ name: a }], [{ name: b }]) =>
        (b === value) - (a === value) ||
        b.localeCompare(a),
    array = [[{ name: 'b', val: '1' }, { name: 'b', val: '10' }], [{ name: 'a', val: '2' }, { name: 'a', val: '2' }], [{ name: 'c'}, { name: 'c', val: '100' }]];

array.sort(sortBy('a'));

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

ES5

var sortBy = function (value) {
        return function (a, b) {
            return (b[0].name === value) - (a[0].name === value)
                || b[0].name.localeCompare(a[0].name);
        };
    },
    array = [[{ name: 'b', val: '1' }, { name: 'b', val: '10' }], [{ name: 'a', val: '2' }, { name: 'a', val: '2' }], [{ name: 'c'}, { name: 'c', val: '100' }]];

array.sort(sortBy('a'));

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

感谢@NirAlfasi Advice,我找到了一种方法:

function customSort(arr, sortBy, priority){
    var sortAZ = function(a,b){return (a[0][sortBy] < b[0][sortBy]) ? -1 : (a[0][sortBy] > b[0][sortBy]) ? 1 : 0;}
    var sortPrior = function(a,b){if(b[0][sortBy] === priority ){return 1} else {return 0}}

    arr.sort(sortAZ).reverse().sort(sortPrior);
}
customSort(ar,'name','a')

console.log(ar);