我有一个数组:
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按姓对数组进行排序吗?还是有另一种较为简单的方法?
答案 0 :(得分:9)
您可以考虑使用本机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);
.localeCompare()
返回一个整数,该整数表示被调用的字符串还是所传递的字符串按字母顺序排在首位。
答案 1 :(得分:3)
这是一个班轮
src
答案 2 :(得分:2)
Array.sort()与String.match()和已经提到的String.localeCompare()一起可以解决该问题。请注意,如果您有复合姓氏,这也将起作用。
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()
将使您的原始数组发生变异,如果您不希望发生这种情况,则可以在使用Array.slice()对数组进行排序之前创建一个副本。示例:
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);
答案 3 :(得分:1)
您可以创建如下所示的比较函数,并使用.sort()
按姓氏排序
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;
}
答案 4 :(得分:1)
另一种解决方案是使用两个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); // a b c
console.log(arr5.reverse()); // c b a
答案 5 :(得分:0)
//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)
答案 6 :(得分:0)
<!-- 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 -->
答案 7 :(得分:-1)
在这里,我使用.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))