如何使用 Lodash 在数字数组中按位置排序

How to do position by position sorting in an array of array of numbers using Lodash

我有一个字符串数组需要排序:

['1.2.3', '1.5.2', '1.23', '1.20.31']

是否可以对数组进行排序,以便在将字符串按 1.2.3 等点拆分为 ['1','2', '3'] 后,我们可以逐个位置与另一个数组进行比较(如 Python元组比较)?

预期结果

['1.2.3', '1.5.2' '1.20.31', '1.23']

我知道可以使用原生 JavaScript .sort 和比较函数获取 2 个对象,但我不能使用 JS 排序,因为我不能修改原始数组。是否可以使用 Lodash 的 _.sortBy 期望您提供关键功能?

Vanilla.js 的解决方案:

var data = ['1.2.3', '1.5.2', '1.23', '1.20.31'];

function customSort(d) {
    return d.map(function (a) {
        return a.split('.').map(Number);
    }).sort(function (a, b) {
        var l = 0, m = Math.min(a.length, b.length);
        while (l < m && a[l] === b[l]) {
            l++;
        }
        return l === m ? a.length - b.length : a[l] - b[l];
    }).map(function (a) {
        return a.join('.');
    });
}

document.write('<pre>sorted array ' + JSON.stringify(customSort(data), 0, 4) + '</pre>');
document.write('<pre>original array ' + JSON.stringify(data, 0, 4) + '</pre>');

c5 + lodash

var data = ['1.2.3', '1.5.2', '1.23', '1.20.31'];
var sortedData = _.sortBy(data, function(x){ return
                   x.split('.')
                    .map(function(i){ return 
                       _.padLeft(i, 5, '0'); })
                    .join('');
                 }));

c6 + lodash

var data = ['1.2.3', '1.5.2', '1.23', '1.20.31'];
var sorteddData = _.sortBy(data, x =>
                    x.split('.')
                     .map(i => _.padLeft(i, 5, '0'))
                     .join('')
                    );

您可以使用 sortByAll() 进行复杂排序,如下所示:

var arr = ['1.2.3', '1.5.2', '1.23', '1.20.31', '1.20.29'];

function splitNumber(index, str) {
    return parseInt(_.get(str.split('.'), index, 0));
}

_.sortByAll(
    arr,
    _.partial(splitNumber, 0),
    _.partial(splitNumber, 1),
    _.partial(splitNumber, 2)
);
// → ["1.2.3", "1.5.2", "1.20.29", "1.20.31", "1.23"]

splitNumber() 函数从我们要作为排序依据的字符串中获取项目,作为整数。然后我们使用 partial()sortByAll().

创建 3 个迭代器