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