在javascript中使用姓氏对数组对象排序

在javascript中使用姓氏对数组对象排序,javascript,arrays,sorting,Javascript,Arrays,Sorting,这是一个数组对象,其值组合为名称和姓氏 如何按姓氏排序 var myArr = ["gopal, roy", "shaym, verma", "akash, jaiswal"]; 您可以使用拆分和比较进行排序 var myArr=[“戈帕尔,罗伊”,“沙伊姆,维尔玛”,“阿卡什,杰斯瓦尔]; 功能比较(a、b){ 设sA=a.拆分(“”); 让sB=b分开(“”); 设lA=sA.pop(); 让lB=sB.pop(); 设n=lB.localeCompare(lA); 如果(n==-1)

这是一个数组对象,其值组合为
名称
姓氏

如何按姓氏排序

var myArr  = ["gopal, roy", "shaym, verma", "akash, jaiswal"];

您可以使用拆分和比较进行排序

var myArr=[“戈帕尔,罗伊”,“沙伊姆,维尔玛”,“阿卡什,杰斯瓦尔];
功能比较(a、b){
设sA=a.拆分(“”);
让sB=b分开(“”);
设lA=sA.pop();
让lB=sB.pop();
设n=lB.localeCompare(lA);
如果(n==-1)返回1;
否则返回-1;
返回0;
}
让排序=myArr.sort(比较);
控制台日志(已排序)

假设逗号后的名称是姓氏,您可以将每个内部字符串拆分为一个包含名字和第二个名字的数组,然后使用destructuring从两个内部数组中获取姓氏。然后,可以使用按字典顺序比较两个字符串。最后,您可以再次将内部数组转换回字符串数组

见下例:

const myArr=[“戈帕尔,罗伊”,“沙伊姆,维尔玛”,“阿卡什,杰斯瓦尔];
常数res=myArr
.map(name=>name.split(','))
.sort(([[uu,a],[uu,b])=>a.localeCompare(b))
.map(name=>name.join(',');
控制台日志(res)
var myArr=[“戈帕尔,罗伊”,“沙伊姆,维尔玛”,“阿卡什,杰斯瓦尔];
函数sortBySurname(a,b){
如果(a.split(',')[0]b.split(',')[0]){
返回1;
}
返回0;
}
myArr.sort(sortBySurname)
console.log(myArr)
我强烈建议您制作如下对象

let myArr=[
    {
        firstName:"gopal",
        surName:"roy"
    },
    {
        firstName:"shaym",
        surName:"verma"
    },
    {
        firstName:"akash",
        surName:"jaiswal"
    }
]

function sortBySurname(a, b) {
    if (a.surName < b.surName) {
        return -1;
    }
    else if (a.surName > b.surName) {
        return 1;
    }
    return 0;
}
myArr.sort(sortBySurname)
console.log(myArr)
myArr=[
{
名字:“戈帕尔”,
姓:“罗伊”
},
{
名字:“shaym”,
姓:“verma”
},
{
名字:“阿卡什”,
姓:“杰斯瓦尔”
}
]
函数sortBySurname(a,b){
如果(a.姓b.姓氏){
返回1;
}
返回0;
}
myArr.sort(sortBySurname)
console.log(myArr)

选择一款针对大型数据集进行优化的产品。正则表达式可以替换为
trim
。每个记录只使用缓存解析一次,如果记录发生更改并且需要在更新时重新排序,则会进一步提高排序速度

const数据=[
“戈帕尔,罗伊”,
“shaym,Verma”,
“阿卡什,杰斯瓦尔”
]
常量缓存={}
const getLastName=s=>(
缓存[s]=缓存[s]| | s.split(',')[1].trim()
)
console.log(
data.sort(
(a,b)=>getLastName(a).localeCompare(getLastName(b))
)

)
您可以使用正则表达式获取姓氏,然后使用
localeCompare
var myArr=[“戈帕尔,罗伊”,“沙伊姆,维尔玛”,“阿卡什,杰斯瓦尔];
释放=我的数组排序((a,b)=>
a、 匹配(/,(.*)/)[1]。本地比较(b.match(/,(.*)/)[1])
);

控制台。注销左边是姓氏还是右边?数据太好了。抛出混合大小写和一些空格填充,使其成为现实。建议:1。您不应该使用
sB[sB.length-1],
,而应该使用
pop
。这确实会改变数组,但在这里它并不重要。2.使用
string.localeCompare
代替
if
梯形图。3.您不需要
$()
,因为您没有与DOM交互。直接放置代码这看起来更干净,但对于大型阵列,这将是昂贵的。您正在进行
2n
额外的迭代。@Rajesh fair point,我添加了一种更有效的方法,删除了额外的
2n
工作
let myArr=[
    {
        firstName:"gopal",
        surName:"roy"
    },
    {
        firstName:"shaym",
        surName:"verma"
    },
    {
        firstName:"akash",
        surName:"jaiswal"
    }
]

function sortBySurname(a, b) {
    if (a.surName < b.surName) {
        return -1;
    }
    else if (a.surName > b.surName) {
        return 1;
    }
    return 0;
}
myArr.sort(sortBySurname)
console.log(myArr)