javascript反向数组而不使用reverse()

时间:2016-11-22 20:40:41

标签: javascript

我想在不使用reverse()函数的情况下反转数组:

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]有人可以告诉我,为什么我的反向功能是错误的?提前谢谢!

22 个答案:

答案 0 :(得分:4)

您可以使用Array.prototype.reduceright并将其反转

检查以下代码段

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

console.log(arr);

答案 1 :(得分:3)

array.pop()从数组中删除弹出的元素,将其大小减小一个。一旦您处于i === 4,您的中断条件不再评估为{{1循环结束。

一种可能的解决方案:

true

答案 2 :(得分: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);

答案 3 :(得分:2)

无需弹出任何内容......只需以相反的顺序遍历现有数组即可创建新数组。

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]));

在接受回答后编辑。

你的开场白评论中的一个链接让我按照接受的答案的方式测试我的方式。我很高兴看到我的方式,至少在我的情况下,每次都变得更快。虽然差距很小但是速度越快越好。

这是我用来测试它的复制/粘贴(从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();

答案 4 :(得分: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]));

答案 5 :(得分:1)

当您从第一个数组中弹出项目时,它的长度会发生变化,并且您的循环计数会缩短。您需要缓存原始数组的原始长度,以便循环运行正确的次数。

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

  return output;
}

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

答案 6 :(得分:1)

您正在修改原始阵列并更改其大小。而不是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]));

答案 7 :(得分:1)

此片段允许在不弹出,拼接或推入的情况下将阵列反转到位。

var arr = [1, 2, 3, 4, 5];
function reverseArrayInPlace(arr2) {
  var half = Math.floor(arr2.length / 2);
  for (var i = 0; i < half; i++) {
    var temp = arr2[arr2.length - 1 - i];
    arr2[arr2.length - 1 - i] = arr2[i];
    arr2[i] = temp;
  }
  return arr2;
}

答案 8 :(得分:1)

在不使用内置函数和额外空间的情况下反转数组的解决方案。

let arr = [1, 2, 3, 4, 5, 6, 7];
let n = arr.length-1;

for(let i=0; i<=n/2; i++) {
  let temp = arr[i];
  arr[i] = arr[n-i];
  arr[n-i] = temp;
}
console.log(arr);

答案 9 :(得分:0)

您可以使用.map,因为它非常适合这种情况,并且只有1行:

const reverse = a =>{ i=a.length; return a.map(_=>a[i-=1]) }

这将获取数组,并为每个索引将其更改为数组的长度-索引,或数组的另一侧。

答案 10 :(得分:0)

最短的一个:

let reverse = arr = arr.map(arr.pop, [...arr])

答案 11 :(得分:0)

reverse=a=>a.map((x,y)=>a[a.length-1-y])

reverse=a=>a.map((x,y)=>a[a.length-1-y])

console.log(reverse(["Works","It","One","Line"]))

答案 12 :(得分:0)

function reverse(arr) {
  for (let i = 0; i < arr.length - 1; i++) {
    arr.splice(i, 0, arr.pop())
  }
  return arr;
}
console.log(reverse([1, 2, 3, 4, 5]))
//without another array

答案 13 :(得分:0)

在ES6中,它可以写为

reverse = (array) => array.map(array.pop, [... array]);

答案 14 :(得分:0)

还有一个:

function reverseArray(arr) { 
    let top = arr.length - 1;
    let bottom = 0;
    let swap = 0;
    
    while (top - bottom >= 1) {
        swap = arr[bottom];
        arr[bottom] = arr[top];
        arr[top] = swap;
        bottom++;
        top--;
    }
}

答案 15 :(得分:0)

带有反向for循环


let array = ["ahmet", "mehmet", "aslı"]


    length = array.length
    newArray = [];
    for (let i = length-1; i >-1; i--) {

        newArray.push(array[i])

    }

    console.log(newArray)

答案 16 :(得分:0)

function rvrc(arr) {
  for (let i = 0; i < arr.length / 2; i++) {
    const buffer = arr[i];

    arr[i] = arr[arr.length - 1 - i];
    arr[arr.length - 1 - i] = buffer;
  }
};

答案 17 :(得分:0)

这段代码无需使用第二个数组即可工作。它使用内置的方法splice。

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

答案 18 :(得分:0)

在这里,让我们定义函数

function rev(arr) {
var i;
var na = [];
for (i=0; i<arr.length; i++) {
na.push(arr[arr.length-i])
}
return na
}

假设您的数组定义为'abca',并且包含['a','b','c','d','e','foo','bar']

我们会做的:

var reva = rev(abca)

这将使'reva'返回['bar','foo','e','d','c','b','a']。 希望我能帮上忙!

答案 19 :(得分:0)

这是因为每次执行array.pop()时,它都会返回数组中的最后一个索引,它也会从数组中删除它。循环在每次迭代时重新计算数组的长度。因为数组在每次迭代时得到的索引更短,所以从函数返回的数组要短得多。

答案 20 :(得分:-1)

function reverse(str1) {
  let newstr = [];
  let count = 0;
  for (let i = str1.length - 1; i >= 0; i--) {
    newstr[count] = str1[i];
    count++;
  }
  return newstr;
}
reverse(['x','y','z']);

答案 21 :(得分:-1)

数组=[2,3,4,5]

 for(var i=0;i<Array.length/2;i++){
    var temp =Array[i];
    Array[i]=Array[Array.length-i-1]
    Array[Array.length-i-1]=temp
}

console.log(Array) //[5,4,3,2]