按静态值范围对数组进行排序

时间:2016-10-18 23:25:30

标签: javascript arrays sorting

我有一个数组,为简单起见,我们可以这样说:

var array = [2,55, 22, 6, 7];

我想对它进行排序,我会这样做:

array.sort(function (a, b) {
    return b > a ? -1: 1;
});

或者如果我想按升序排序,我会这样做:

array.sort(function (a, b) {
    return b < a ? -1: 1;
});

现在,让我们说我有一个我想要排序的值。 所以基本上我想用大于数字的值对数组进行排序。 所以,如果数字是6,我希望我的数组看起来像这样:

  

55,22,7,6,2

但如果我想在两个数字之间进行排序,让我们说6和23,我希望它返回这样的内容:

  

22,7,55,6,2

最后3个项目可以按照任何顺序出现,但是我排序的范围必须先出现。

有谁知道如何实现这一目标。 我试过这样的:

// Sort our mapped array
mapped.sort(function (a, b) {

    // Loop through our properties
    for (var i = 0; i < fields.length; i++) {

        // Get our value (skip the first)
        var field = fields[i],
            x = a[field.name],
            y = b[field.name];

        // If our values are the same, go to the next compare
        if (x === y)
            continue;

        // If we are using greater than
        if (field.operator === '>') {

            // Check that the value matches our expression
            return y < field.expression ? -1 : 1;
        }

        // If we are using less than
        if (field.operator === '<') {

            // Check that the value matches our expression
            return y > field.expression ? -1 : 1;
        }
    }
});

field.expression 保存范围值。如您所见,我正在围绕字段进行循环,然后尝试排序。

3 个答案:

答案 0 :(得分:1)

您的比较功能需要检查项目是否在范围内,然后将其放在范围之外的项目之前。如果两者都在内部,或者两者都在外面,则必须像往常一样进行比较。

以下代码执行此操作:

var array = [2,55, 22, 6, 7];
var low = 6,
    high = 23;
array.sort(function(a, b) {
    return ((b >= low && b < high) - (a >= low && a < high)) || (a - b);
});

答案 1 :(得分:0)

此函数对您的数组进行排序,然后将大于给定最小值的所有数字推送到数组的后面。

编辑:只需拨打一次splice()即可获得更好的效果。

&#13;
&#13;
var array = [2,55, 22, 6, 7];

function sortBetween(arr, min){
  var sorted = arr.sort(function(a, b) {
    return a - b;
  });
  var spliceIndex = sorted.length - 1;
  while(sorted[spliceIndex] > min) {
    spliceIndex--;
  }
  
  var tmp = sorted.splice(spliceIndex, sorted.length - 1 - spliceIndex);
  tmp.forEach(function(el, i) {
    sorted.unshift(el);
  });
    
  return sorted;
}
console.log(sortBetween(array, 6));
&#13;
&#13;
&#13;

结果是,您的排序数组以您的最小数字开头。没有必要设置最大值,因为你说:

  

最后3个项目可以按照任何顺序出现,但是我排序的范围必须先出现。

答案 2 :(得分:0)

如果一个数组元素超出你关心的范围,只需用一个荒谬的大值替换它,使它移动到列表的末尾。

由于ab具有本地范围,因此不会影响实际数组,只会影响比较。

array.sort(function (a, b) {
    if (a<6 || a>23) a = Number.MAX_SAFE_INTEGER;
    if (b<6 || b>23) b = Number.MAX_SAFE_INTEGER;
    return b > a ? -1: 1;
});