我有一个字符串数组,我必须排序:
['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
,希望您提供关键功能?
答案 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个迭代。