2016-11-22 25 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

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