我有一个简单的FOR语句:
var num = 10,
reverse = false;
for(i=0;i<num;i++){
console.log(i);
}
当反向为false时,我希望它返回类似[0,1,2,3,5,5,7,8,9]
的内容但是,当反向为真时,它应该返回[9,8,7,6,5,4,3,2,1,0]
获取此结果的最有效方法是,如果反向在循环内是真还是假,每次都不进行检查?
我不想这样做:
var num = 10,
reverse = false;
for(i=0;i<num;i++){
if(reverse) console.log(num-i)
else console.log(i)
}
我想在循环外只检查一次反向。
答案 0 :(得分:19)
var num = 10,
reverse = false;
if(!reverse) for( var i=0;i<num;i++) log(i);
else while(num-- ) log(num);
// to avoid duplication if the code gets long
function log( num ) { console.log( num ); }
修改强>
如下面的评论中所述,如果i
未在其他地方声明,并且您不打算将其设为全局,则使用您声明的其他变量声明它。
如果您不想修改num
的值,请先将其分配给i
。
var num = 10,
reverse = false,
i;
if(!reverse) for(var i=0;i<num;i++) log(i); // Count up
else {var i=num; while(i--) log(i);} // Count down
function log( num ) { console.log( num ); }
答案 1 :(得分:7)
尝试使用2个循环:
if (reverse) {
for(i=num-1;i>=0;i--){
console.log(i)
}
}
else {
for(i=0;i<num;i++){
console.log(i)
}
}
答案 2 :(得分:6)
var num = 10,
reverse = false;
for (var i = 0, n = reverse?num-1:0, d = reverse?-1:1; i < num; i++, n+=d) {
console.log(n);
}
这相当于以下内容,它更具可读性,但不那么紧凑:
var num = 10,
reverse = false;
var start = reverse ? num-1 : 0,
end = reverse ? -1 : num,
step = reverse ? -1 : 1;
for (var i = start; i != end; i += step) {
console.log(i);
}
修改强>
实际上,这两个解决方案并不相同,因为第一个解决方案具有额外的增量操作。不过,从性能的角度来看,它可以忽略不计。如果您真的想要获得性能最佳的紧凑型解决方案,您可以执行以下操作(不适合胆小的人):
var num = 10,
reverse = false;
for (var r=reverse, i=r?num-1:0, n=r?-1:num, d=r?-1:1; i!=n; i+=d) {
console.log(i);
}
这具有以下优点:具有单个控制结构,每个循环中的单个测试以及单个迭代器添加。它没有迭代器递增/递减那么快,但只是稍微如此。
答案 3 :(得分:3)
var start; var end; var inc;
if (reverse) {
start = num-1; end = 0; inc = -1;
}
else {
start = 0; end = num-1; inc = 1;
}
for(i=start;i!=end;i+=inc){
console.log(i)
}
答案 4 :(得分:2)
前几天我才发现需要这个。我是这样做的:
var num = 10,
i = 0,
direction = 1,
reverse = false;
if(reverse)
i = num + (direction = num = -1);
for(; i !== num; i += direction) {
console.log(i);
}
不需要单独的循环,也不需要数学来计算循环中正确的i
。
所以如果reverse
是true
...
i
(代表我们的第一项)变为num - 1
,所以我们现在开始讨论最后一项
num
(代表越界)变为-1
,所以我们现在停止了第一项
direction
为-1
,这意味着当我们i += direction
因此,通过将我们的起点与结束点交换并将i
的更改从1
更改为-1
,我们将根据这些修改进行上升或下降。< / p>
答案 5 :(得分:1)
我认为这符合您的要求:
var num = 10;
var reverse = false;
var diff = 0;
if (reverse) {
diff = num - 1;
}
for (i = 0; i < num; i++) {
console.log(Math.abs(diff - i));
}
答案 6 :(得分:1)
以下是我一直做反向循环的方法:
for (i = num; --i >= 0; ) ...
答案 7 :(得分:0)
你的问题是什么:
if (reverse)
{
for(i=num-1; i>=0;i--){
console.log(i);
}
}
else
{
for(i=0;i<num;i++){
console.log(i)
}
}
}
答案 8 :(得分:0)
罗伊与我的相似,但这就是我的想法。我会告诉你我在C#中写的内容以及我认为它如何转换为Javascript。
C#
int num = 10;
bool reverse = true;
for (int i = reverse ? num : 0; (reverse ? 0 : i) < (reverse ? i : num); i += reverse ? -1 : 1)
{
Console.Write((reverse ? i - 1 : i).ToString());
}
Console.ReadKey();
的Javascript
var num = 10,
reverse = true;
for (int i = reverse ? num : 0; (reverse ? 0 : i) < (reverse ? i : num); i += reverse ? -1 : 1)
{
console.log(reverse ? i - 1 : i);
}
这是另一种方式
的Javascript
var num = 10,
reverse = false;
for (int i = 0; i < num; i++)
{
console.log((reverse ? abs(-num + (i + 1)) : i));
}
答案 9 :(得分:0)
似乎有效:
var num = 10;
var z = 1;
var k = -10;
if (reverse ){
k = -1;
z = -1;
}
for(int i = 0; i < 10; i++){
console.log(num+i*z+k);
}
答案 10 :(得分:0)
当然,在像Javascript这样的语言中,必须有一种方法来定义本地函数并在循环中使用它?
function SubtractFrom(val, subtractor) {
return val - subtractor;
}
function PassThrough(val) {
return val;
}
var num = 10;
var processor = reverse ? SubtractFrom(num-1) : PassThrough;
for (i = 0; i < num; i++) {
console.log(processor(i));
}
虽然不知道Javascript,但我不知道函数定义会采用什么样的实际形式。
答案 11 :(得分:0)
//reverse a number
let c = [2,3,5,67,4]
let sum = '';
let d = c.toString().split('')
console.log(d)
for(let i = d.length-1; i >= 0; i--) {
sum += d[i]
}
console.log(sum)