如何使用 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 个迭代器
我有一个字符串数组需要排序:
['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()
.