如何使用Lodash在数组数组中进行位置排序

时间:2015-08-12 17:47:54

标签: javascript 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 ,希望您提供关键功能?

3 个答案:

答案 0 :(得分:2)

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>');的解决方案:

{{1}}

答案 1 :(得分:1)

ES5 + 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('');
                 }));

ES6 + 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('')
                    );

答案 2 :(得分:1)

您可以使用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个迭代。

相关问题