Javascript 在Firefox和Chrome之间,对具有null属性的对象进行排序会产生不同的结果
我有一个对象数组,我正试图对其应用两种排序。对“name”属性进行简单的字母排序,然后对“rank”属性进行排序,该属性可以是数字或null。具有空“rank”的对象应排序到最终数组的末尾 此代码在Chrome、Safari和Edge中正常工作。然而,在Firefox中,它颠倒了所有具有空“rank”的对象的字母顺序 JSFiddle: 代码:Javascript 在Firefox和Chrome之间,对具有null属性的对象进行排序会产生不同的结果,javascript,arrays,sorting,firefox,Javascript,Arrays,Sorting,Firefox,我有一个对象数组,我正试图对其应用两种排序。对“name”属性进行简单的字母排序,然后对“rank”属性进行排序,该属性可以是数字或null。具有空“rank”的对象应排序到最终数组的末尾 此代码在Chrome、Safari和Edge中正常工作。然而,在Firefox中,它颠倒了所有具有空“rank”的对象的字母顺序 JSFiddle: 代码: const数据=[ { “名称”:“F”, “排名”:2 },{ “名称”:“B”, “秩”:空 },{ “姓名”:“A”, “排名”:1 },{ “名
const数据=[
{
“名称”:“F”,
“排名”:2
},{
“名称”:“B”,
“秩”:空
},{
“姓名”:“A”,
“排名”:1
},{
“名称”:“E”,
“秩”:空
},{
“名称”:“D”,
“秩”:空
},{
“姓名”:“C”,
“排名”:2
}
]
常量名称排序=(a,b)=>{
const nameA=a.name.toUpperCase();
const nameB=b.name.toUpperCase();
if(nameA名称B){
返回1;
}
返回0;
};
常量rankSort=(a,b)=>{
如果(a.rank==null){
返回1;
}else if(b.rank==null){
返回-1;
}
返回0;
}
console.log('name only',data.sort(nameSort));
log('name and rank',data.sort(nameSort).sort(rankSort));
这里哪个浏览器是正确的?或者,可以采取任何措施来实现浏览器之间的一致性吗?看起来,您为相同的值返回了错误的值以进行比较 例如,使用
a.rank===null
和b.rank===null,您将返回1
,但在本例中,返回的正确值为零
排序算法的实现取决于供应商,可以返回不同的结果,具体取决于排序顺序,例如从开始到结束
为了克服这个问题,您需要实现一个算法,该算法对于相等的值返回零
const data=[{name:“F”,秩:2},{name:“B”,秩:null},{name:“A”,秩:1},{name:“E”,秩:null},{name:“D”,秩:null},{name:“C”,秩:2}]
常量名称排序=(a,b)=>{
const nameA=a.name.toUpperCase();
const nameB=b.name.toUpperCase();
返回nameA>nameB | |-(nameA(a.rank==null)-(b.rank==null)
console.log('name only',data.sort(nameSort));
log('name and rank',data.sort(nameSort).sort(rankSort))代码>
.as控制台包装{max height:100%!important;top:0;}
这里是解决此问题的另一种方法。您可以结合使用Array.prototype.sort()
和Array.prototype.filter()
方法来获得最终结果。首先,对name属性应用字母排序。之后,使用数组过滤器方法将所有null'rank'属性放在数组的末尾
const数据=[
{
名称:“F”,
排名:2,
},
{
名称:‘B’,
等级:空,
},
{
名称:‘A’,
排名:1,
},
{
名称:'E',
等级:空,
},
{
名称:“D”,
等级:空,
},
{
名称:‘C’,
排名:2,
},
];
data.sort((x,y)=>x.name.localeCompare(y.name));
console.log('仅限名称',数据);
常数ret=[
…data.filter((x)=>x.rank!==null),
…data.filter((x)=>x.rank==null),
];
console.log('name and rank',ret)代码>
const data = [
{
"name": "F",
"rank": 2
},{
"name": "B",
"rank": null
},{
"name": "A",
"rank": 1
},{
"name": "E",
"rank": null
},{
"name": "D",
"rank": null
},{
"name": "C",
"rank": 2
}
]
const nameSort = (a, b) => {
const nameA = a.name.toUpperCase();
const nameB = b.name.toUpperCase();
if (nameA < nameB) {
return -1;
} else if (nameA > nameB) {
return 1;
}
return 0;
};
const rankSort = (a, b) => {
if (a.rank === null) {
return 1;
} else if (b.rank === null) {
return -1;
}
return 0;
}
console.log('name only', data.sort(nameSort));
console.log('name and rank', data.sort(nameSort).sort(rankSort));