【问题标题】:sort array of arrays in specific order using lodash使用 lodash 按特定顺序对数组进行排序
【发布时间】:2021-03-10 13:11:47
【问题描述】:

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

  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)。

【问题讨论】:

  • 你在任何地方都没有 DESC
  • 请访问help center,使用tour查看内容和How to Ask。做一些研究,搜索关于 SO 的相关主题;如果您遇到困难,请发布您的尝试minimal reproducible example,并使用[<>] sn-p 编辑器记录输入和预期输出。
  • 去掉'a',降序排序,然后添加以'a'元素开头的数组。
  • @mplungjan > 'A' 具有优先权(因为它是作为函数中的参数给出的),所以排序函数将按以下顺序进行:1)A 2)Z 到 A
  • @NirAlfasi Thx,我就这样走

标签: javascript lodash


【解决方案1】:

您可以尝试使用与其他不同的顶部进行降序排序。

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; }

【讨论】:

  • 感谢它有效。但是我要求提供 ES5 代码
【解决方案2】:

感谢@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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 2021-09-10
    • 2016-11-01
    相关资源
    最近更新 更多