2016-11-22 70 views
2

欲逆转阵列不使用反向()函数是这样的:JavaScript的反向阵列不使用反向()

function reverse(array){ 
    var output = []; 
    for (var i = 0; i<= array.length; i++){ 
     output.push(array.pop()); 
    } 

    return output; 
} 

console.log(reverse([1,2,3,4,5,6,7])); 

然而,它显示[7,6,5,4]可有人告诉我,为什么我的反向功能是错误的?提前致谢!

+0

你有什么想要告诉你? – happymacarts

+1

这个问题有多少答案?其中没有一个提到逆转。 http://stackoverflow.com/questions/5276953/what-is-the-most-efficient-way-to-reverse-an-array-in-javascript有 – axlj

+1

@axlj,“怎么会有这么多的答案... “因为有不止一种方式来剥皮猫,在这种情况下,也可以逆转猫。 – zzzzBov

回答

2

array.pop()从阵列中移除的弹出的元件,由一个减小其大小。一旦你在i === 4,你的休息条件不再计算为true并结束循环。


一个可能的解决方案:

function reverse(array) { 
 
    var output = []; 
 
    while (array.length) { 
 
    output.push(array.pop()); 
 
    } 
 

 
    return output; 
 
} 
 

 
console.log(reverse([1, 2, 3, 4, 5, 6, 7]));

+0

非常感谢!我知道了! –

2

做一个反向的方式,因为当你每一个数组的长度,得到了受影响的时间做.pop()

function reverse(array){ 
    var output = []; 
    for (var i = array.length; i > 0; i--){ 
     output.push(array.pop()); 
    } 
    return output; 
} 

console.log(reverse([1,2,3,4,5,6,7])); 

或者你可以从阵列飞出之前缓存在可变的阵列的长度,

function reverse(array){ 
    var output = []; 
    for (var i = 0, len= array.length; i< len; i++){ 
     output.push(array.pop()); 
    } 

    return output; 
} 

console.log(reverse([1,2,3,4,5,6,7])); 
+0

太谢谢你了!我知道了! –

1

正如你弹出项关闭第一阵列,它的长度变化,你的循环计数缩短。您需要缓存原始数组的原始长度,以便循环运行正确的次数。

function reverse(array){ 
 
    var output = []; 
 
    var len = array.length; 
 
    for (var i = 0; i< len; i++){ 
 
     output.push(array.pop()); 
 
    } 
 

 
    return output; 
 
} 
 

 
console.log(reverse([1,2,3,4,5,6,7]));

+0

非常感谢!我知道了! –

+0

反对,没有正确答案的解释。太好了! –

0

这是因为每次你array.pop(),而它的数组中返回的最后一个索引,它也从阵列中删除。循环会在每次迭代时重新计算数组的长度。因为数组被在每次迭代1个指数短,你会得到一个更短的阵列从函数返回。

2

您正在修改你reverse功能,这是影响array.length现有的阵列。

不要pop关闭阵列,只访问项目的阵列和unshift在项目的新阵列上,使得现有的数组的第一个元素成为新数组的最后一个元素:

function reverse(array){ 
 
    var output = [], 
 
     i; 
 
    for (i = 0; i < array.length; i++){ 
 
    output.unshift(array[i]); 
 
    } 
 

 
    return output; 
 
} 
 

 
console.log(reverse([1,2,3,4,5,6,7]));

如果您想就地相似的阵列进行修改以Array.prototype.reverse怎么做(这是一般不宜引起副作用),可以拼接的阵列,并且不印字的项背的开始:

function reverse(array) { 
 
    var i, 
 
     tmp; 
 
    for (i = 1; i < array.length; i++) { 
 
    tmp = array.splice(i, 1)[0]; 
 
    array.unshift(tmp); 
 
    } 
 
    return array; 
 
} 
 

 
var a = [1, 2, 3, 4, 5]; 
 
console.log('reverse result', reverse(a)); 
 
console.log('a', a);

+0

非常感谢!我知道了! –

2

您可以使用Array.prototype.reduceright和扭转它

检查下面的代码片段

var arr = ([1, 2, 3, 4, 5, 6, 7]).reduceRight(function(previous, current) { 
 
    previous.push(current); 
 
    return previous; 
 
}, []); 
 

 
console.log(arr);

+0

你可以使用'push',而不是'concat'缓解过程 –

+0

谢谢指点...相应修改 – Geeky

1

你修改日e原始数组并改变其大小。而不是一个for循环,你可以使用一个while

function reverse(array){ 
 
     var output = []; 
 
     while(array.length){ 
 
      //this removes the last element making the length smaller 
 
      output.push(array.pop()); 
 
     } 
 

 
     return output; 
 
} 
 

 
console.log(reverse([1,2,3,4,5,6,7]));

+0

太谢谢你了!我知道了! –

+0

为什么向下票呢? – nottu

1

无需弹出什么......只是通过以相反的顺序,让您的新的一个现有的阵列迭代。

function reverse(array){ 
    var output = []; 
    for (var i = array.length - 1; i> -1; i--){ 
     output.push(array[i]); 
    } 

    return output; 
} 

console.log(reverse([1,2,3,4,5,6,7])); 

答案被接受后编辑。

在您的开场白帖子的评论中的链接使我测试我的方式VS接受的答案的方式。我很高兴地看到,我的方式,至少在我的情况下,每一次都变得更快。但幅度不大,但速度更快。

这里是我用来测试它(从Firefox开发便笺测试)的复制/粘贴:

function reverseMyWay(array){ 
    var output = []; 
    for (var i = array.length - 1; i> -1; i--){ 
     output.push(array[i]); 
    } 

    return output; 
} 

function reverseTheirWay(array) { 
    var output = []; 
    while (array.length) { 
    output.push(array.pop()); 
    } 

    return output; 
} 

function JustDoIt(){ 
    console.log("their way starts") 
    var startOf = new Date().getTime(); 
    for(var p = 0; p < 10000; p++) 
     { 
      console.log(reverseTheirWay([7,6,5,4,3,2,1])) 
     } 
    var endOf = new Date().getTime(); 
    console.log("ran for " + (endOf - startOf) + " ms"); 
    console.log("their way ends") 

} 


function JustDoIMyWay(){ 
    console.log("my way starts") 
    var startOf = new Date().getTime(); 
    for(var p = 0; p < 10000; p++) 
     { 
      console.log(reverseMyWay([7,6,5,4,3,2,1])) 
     } 
    var endOf = new Date().getTime(); 
    console.log("ran for " + (endOf - startOf) + " ms"); 
    console.log("my way ends") 
} 

JustDoIt(); 
JustDoIMyWay(); 
+0

非常感谢你!我知道了! –