对数组进行排序 - 传递比较函数

时间:2017-03-03 15:40:55

标签: javascript arrays sorting

我有以下代码:

-initWithStyle:reuseIdentifier:

节点具有此(伪)结构:

var compare = function( nodeA, nodeB ){
    return +nodeA.index - +nodeB.index;
};

var sort = function( nodes ){
    nodes.sort( compare );
};

当我调用{ index: <integer> value: <literal> } 函数并打印出每个节点的索引时,它会以常规方式对它们进行排序:

sort

如何更改当前逻辑以使其看起来像这样? :

0
1
2
3

4 个答案:

答案 0 :(得分:1)

您可以先按索引!= 0的条件排序,然后按索引值排序。

var data = [{
   index: 2,
   value: 'a'
}, {
   index: 0,
   value: 'b'
},{
   index: 3,
   value: 'c'
},{
   index: 1,
   value: 'd'
}]

var result = data.sort(function(a, b) {
  return (b.index != 0) - (a.index != 0) || (a.index - b.index)
})
console.log(result)

答案 1 :(得分:1)

您可以为零添加特殊处理:

var compare = function(nodeA, nodeB) {
  // in case both sides are equal
  if (nodeA.index === nodeB.index) {
    return 0;
  }
  if (nodeA.index === 0) {
    return 1;
  }
  if (nodeB.index === 0) {
    return -1;
  }

  return +nodeA.index - +nodeB.index;
};

var data = [{
  index: 2,
  value: 'a'
}, {
  index: 0,
  value: 'b'
}, {
  index: 3,
  value: 'c'
}, {
  index: 1,
  value: 'd'
}]

data.sort(compare);

console.log(data);

答案 2 :(得分:0)

只需更改比较:

var compare = function( nodeA, nodeB ){
    return ((+nodeA.index || Infinity) - (+nodeB.index || Infinity)) || Infinity;
};

|| operator返回第一个不是“falsy”的值,这是一个“truthy”值,但也是实际值。这是为变量创建默认值的EMCA5“技巧”。

解释:

  • for nodeA.index == 0 && nodeB.index > 0 => Infinity - somevalue == Infinity
  • for nodeA.index > 0 && nodeB.index == 0 => somevalue - Infinity == -Infinity
  • 代表nodeA.index == 0 && nodeB.index == 0 => Infinity - Infinity == NaN,在这种情况下选择|| Infinity选项

答案 3 :(得分:0)

您只需稍微更改比较功能:

var compare = function( nodeA, nodeB ){
  if (!+nodeA.index) return 1;
  if (!+nodeB.index) return -1;
  return +nodeA.index - +nodeB.index;
};