Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Firefox和Chrome之间,对具有null属性的对象进行排序会产生不同的结果_Javascript_Arrays_Sorting_Firefox - Fatal编程技术网

Javascript 在Firefox和Chrome之间,对具有null属性的对象进行排序会产生不同的结果

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 },{ “名

我有一个对象数组,我正试图对其应用两种排序。对“name”属性进行简单的字母排序,然后对“rank”属性进行排序,该属性可以是数字或null。具有空“rank”的对象应排序到最终数组的末尾

此代码在Chrome、Safari和Edge中正常工作。然而,在Firefox中,它颠倒了所有具有空“rank”的对象的字母顺序

JSFiddle:

代码:

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));