Javascript 排序数组-传递比较函数
我有以下代码:Javascript 排序数组-传递比较函数,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有以下代码: var compare = function( nodeA, nodeB ){ return +nodeA.index - +nodeB.index; }; var sort = function( nodes ){ nodes.sort( compare ); }; 该节点具有以下(伪)结构: { index: <integer> value: <literal> } 如何更改当前的逻辑使其看起来像这样 1 2 3 0
var compare = function( nodeA, nodeB ){
return +nodeA.index - +nodeB.index;
};
var sort = function( nodes ){
nodes.sort( compare );
};
该节点具有以下(伪)结构:
{
index: <integer>
value: <literal>
}
如何更改当前的逻辑使其看起来像这样
1
2
3
0 <-- 0 should be considered the biggest index
1
2.
3.
0您可以首先按索引的条件进行排序=代码>0,然后仅按索引值排序
var数据=[{
索引:2,
值:“a”
}, {
索引:0,
值:“b”
},{
索引:3,
值:“c”
},{
索引:1,
值:“d”
}]
var result=data.sort(函数(a,b){
返回(b.index!=0)-(a.index!=0)| |(a.index-b.index)
})
console.log(结果)
只需更改为:
var compare = function( nodeA, nodeB ){
return ((+nodeA.index || Infinity) - (+nodeB.index || Infinity)) || Infinity;
};
||运算符返回的第一个值不是“falsy”,它是一个“truthy”值,但也是实际值。这是EMCA5为变量创建默认值的“技巧”
因此,解释:
- 对于
nodeA.index==0&&nodeB.index>0=>Infinity-somevalue==Infinity
- 对于
nodeA.index>0&&nodeB.index==0=>somevalue-Infinity==-Infinity
- 对于
nodeA.index==0&&nodeB.index==0=>Infinity-Infinity==NaN
,在这种情况下选择|Infinity
选项
您可以为零添加特殊处理:
var compare=函数(节点A、节点B){
//以防双方平等
if(nodeA.index==nodeB.index){
返回0;
}
if(nodeA.index==0){
返回1;
}
if(nodeB.index==0){
返回-1;
}
return+nodeA.index-+nodeB.index;
};
风险值数据=[{
索引:2,
值:“a”
}, {
索引:0,
值:“b”
}, {
索引:3,
值:“c”
}, {
索引:1,
值:“d”
}]
数据。排序(比较);
控制台日志(数据)代码>您只需稍微更改一下比较函数:
var compare = function( nodeA, nodeB ){
if (!+nodeA.index) return 1;
if (!+nodeB.index) return -1;
return +nodeA.index - +nodeB.index;
};
可能重复的
var compare = function( nodeA, nodeB ){
if (!+nodeA.index) return 1;
if (!+nodeB.index) return -1;
return +nodeA.index - +nodeB.index;
};