2017-05-23 56 views
0

对于示例我有一个排序函数,但我想基于另一个变量进行反向。根据变量反转布尔值

我知道什么

  • ifelse
  • 三元?

我想知道是否有某种酷技巧像(true && "return this")!!(+num % 2)种东西。

例子:

var array = [3,5,2,1,7,8,10]; 
 
var reverse = true; 
 

 
array.sort(function(a,b) { 
 
    return a < b // somehow use reverse to sort it reverse order 
 
});

附录

虽然大卫的回答是一个我一直在回答我的问题寻找。如果我期望有条件地排序,这是我认为合适的:短路。

var array = [3,5,2,1,7,8,10]; 
 
var reverse = true; 
 

 
function number_sort(a,b) { 
 
\t return a > b ; 
 
} 
 

 

 
(array.sort(number_sort) && reverse && array.reverse()); 
 

 
console.log(array); 
 

 
reverse = false; 
 

 
(array.sort(number_sort) && reverse && array.reverse()); 
 

 
console.log(array);

+0

为什么不使用'reverse'阵列的方法? – evolutionxbox

+0

@evolutionxbox这只是一个例子。我可以将它用于'localeCompare'或任何其他类型的匹配 –

+0

请注意,'sort'回调应该返回一个值<0, 0 or > 0,但不是'true'或'false'。 – deceze

回答

2

看到,因为你只是从你的sort返回一个布尔版本,你可以返回布尔值是否匹配的布尔值上课你reverse变量:

array.sort(function(a,b) { 
    return a < b == reverse 
}); 
+0

啊,我想这是我正在寻找。简单和一个内衬。将标记何时可以 –

+1

问题是,Array.prototype.sort()期望一个可选函数,必须返回一个int,而不是一个布尔值。 – sp00m

+0

@ sp00m是的,这只是一个例子,我想过滤器大声笑 –

2

你可以使用一个变量asc,这可能对降序排序升序排序值truefalse。然后使用值asc作为因子,如果给出或使用-1进行降序排序。

因子-1按照排序函数的需要反转排序顺序。

var array = [3, 5, 2, 1, 7, 8, 10], 
 
    asc = false; 
 

 
array.sort(function(a, b) { return (asc || -1) * (a - b); }); 
 
console.log(array); 
 

 
asc = true; 
 
array.sort(function(a, b) { return (asc || -1) * (a - b); }); 
 
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

具有关闭了排序顺序

var sortFn = function (asc) { 
 
     return function(a, b) { 
 
      return (asc || -1) * (a - b); 
 
     }; 
 
    }, 
 
    array = [3, 5, 2, 1, 7, 8, 10]; 
 

 
array.sort(sortFn(false)); // desc 
 
console.log(array); 
 

 
array.sort(sortFn(true)); // asc 
 
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

2

我会选择有条件的排序函数:

array.sort(reverse 
    ? (a, b) => a - b 
    : (a, b) => b - a 
); 

优点是条件只计算一次,而不是为每个项目。

否则,很明显:

array.sort(...); 
if (reverse) { 
    array.reverse(); 
} 
+0

啊,你的回答使我短路。这是我正在寻找这个'(array.sort(number_sort)&& false && array.reverse());' –

+0

@ A.Lau在这种情况下,'array.reverse()'不会被称为JS短路布尔运算符。 – sp00m

+0

这就是要点。如果我想让它反转,那么反转就是真的,因此它会在最后反转它。如果我不这样做,那么反向将永远不会被调用。而且由于Javascript改变了对象,这就是我想要的。我+1了给我提醒 –

0

你也可以使用一个三元操作符:

var array = [3,5,2,1,7,8,10]; 
var reverse = true; 

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