我有一个数组,为简单起见,我们可以这样说:
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 保存范围值。如您所见,我正在围绕字段进行循环,然后尝试排序。
答案 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()
即可获得更好的效果。
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;
结果是,您的排序数组以您的最小数字开头。没有必要设置最大值,因为你说:
最后3个项目可以按照任何顺序出现,但是我排序的范围必须先出现。
答案 2 :(得分:0)
如果一个数组元素超出你关心的范围,只需用一个荒谬的大值替换它,使它移动到列表的末尾。
由于a
和b
具有本地范围,因此不会影响实际数组,只会影响比较。
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;
});