问题描述
我有一个数组:
arr4=["John Alpha","Allen Beta", "Elle Cappa"];
我有一个排序函数,可以将字符串数组按降序排序
function getSize(arr){
return arr.length;
}
function sortStringArrDes(arr){
arrSize=getSize(arr);
var temp;
for(j=0; j<arrSize-1; j++){
for(i=0; i<arrSize-1; i++){
if (arr[i] < arr[i+1]){
temp = arr[i+1];
arr[i+1] = arr[i];
arr[i] = temp;
}
}
}
return arr;
}
我可以使用 sortStringArrDes 按姓氏对数组进行排序,还是有另一种不太复杂的方法来做到这一点?
1楼
CertainPerformance
9
2019-02-25 03:38:27
您可以考虑使用本机Array.prototype.sort
方法,而不是尝试重新发明轮子:
const arr4 = ["John Alpha", "Elle Cappa", "Allen Beta"]; arr4.sort((a, b) => b.split(' ')[1].localeCompare(a.split(' ')[1])); console.log(arr4);
返回一个整数,该整数表示调用的字符串还是传递的字符串按字母顺序排在首位。
2楼
lacostenycoder
3
2019-02-25 04:01:13
这是一个班轮
arr4.sort(x => arr4.map(y => y.split(' ')[1]) ).reverse()
3楼
Shidersz
2
2019-02-25 03:58:09
结合和已经提到的可以解决此问题。 请注意,如果您有复合姓氏,这也将起作用。
const input = ["John Alpha", "Elle Cappa", "Allen Beta", "Rob Collyses Chung"]; input.sort( (a, b) => b.match(/\\s(.+)/)[1].localeCompare(a.match(/\\s(.+)/)[1]) ); console.log(input);
更重要的是,您还应该注意Array.sort()
会改变原始数组,如果您不希望发生这种情况,则可以在使用对其进行排序之前,先创建该数组的副本。
例:
const input = ["John Alpha", "Elle Cappa", "Allen Beta", "Rob Collyses Chung"]; let res = input.slice().sort( (a, b) => b.match(/\\s(.+)/)[1].localeCompare(a.match(/\\s(.+)/)[1]) ); console.log("Original is not mutated: ", input); console.log("Sorted copy: ", res);
4楼
Aniket G
1
2019-02-25 03:38:01
您可以创建一个如下所示的比较函数,并使用按姓氏排序
var names = ["Allen Beta", "John Alpha", "Elle Cappa"]; var sortedNames = names.sort(compare); console.log(sortedNames); function compare(a, b) { var splitA = a.split(" "); var splitB = b.split(" "); var lastA = splitA[splitA.length - 1]; var lastB = splitB[splitB.length - 1]; if (lastA < lastB) return -1; if (lastA > lastB) return 1; return 0; }
5楼
Spangle
1
2019-02-25 03:48:07
另一个解决方案是使用两个for循环,拆分每个数组项,将其反转并排序。 然后将其排序后反转,然后将其重新结合在一起。 参见下面的代码:
var arr4=["Allen Beta", "John Alpha", "Elle Cappa"]; var arr5 = []; // Keep the original array as is. for(var i = 0; i < arr4.length; i++){ arr5[i] = arr4[i].split(" ").reverse().join(" "); } arr5.sort(); for(var i = 0; i < arr5.length; i++){ arr5[i] = arr5[i].split(" ").reverse().join(" "); } console.log(arr5); // abc console.log(arr5.reverse()); // cba
6楼
Force Bolt
0
2021-05-27 05:02:44
//Try this way
let arr = [`John Alpha`,`Allen Beta`,`Elle Cappa`];
let new_arr=arr.map(item=>{
return item.split(' ');
})
let sorting = new_arr.sort((a,b)=>{
return b[b.length-1].localeCompare(a[a.length-1]);
})
let merging= sorting.map(item=>{
return item.join(' ');
})
console.log(merging)
7楼
Vikrant Kekan
0
2021-06-19 07:26:50
<!-- language: lang-js -->
let arr = [`John Alpha`,`Allen Beta`,`Elle Cappa`];
var newarr=[];
for(x=0;x<arr.length;x++){
var z=arr[x].split(" ");
var z=z.reverse();
newarr[x]=z;
}
var v=newarr.sort();
var v=v.reverse();
console.log(v);
<!-- end snippet -->
8楼
holydragon
-1
已采纳
2019-02-25 03:36:38
在这里,我使用.split(' ')[1]
获取条件的姓氏,并且看起来可以正常工作。
arr4=["John Alpha","Allen Beta", "Elle Cappa"]; function sortStringArrDes(arr){ arrSize=arr.length; var temp; for(j=0; j<arrSize-1; j++){ for(i=0; i<arrSize-1; i++){ if (arr[i].split(' ')[1] < arr[i+1].split(' ')[1]){ temp = arr[i+1]; arr[i+1] = arr[i]; arr[i] = temp; } } } return arr; } console.log(sortStringArrDes(arr4))