【问题标题】:Reverse array, and return the same array反转数组,并返回相同的数组
【发布时间】:2016-10-30 14:47:35
【问题描述】:

我必须编写一个反转数组的函数(我知道反转方法,但这次我必须编写一个函数)。此函数必须将数组变量作为输入并返回相同的变量,但元素的顺序相反。我不明白为什么这段代码有效:

function reverseArrayInPlace(array) {
  for (i = array.length; i > 0; i--) {
    array.shift(array.push(i));
  }
  return array;
};

而且这段代码没有

function reverseArrayInPlace(array) {
  for (i = array.length; i > 0; i--) {
    array.unshift(array.pop(i));
  }
  return array;
};

虽然他们做的事情完全一样?

【问题讨论】:

  • 根据定义,他们没有做同样的事情。 shiftunshift 是不同的方法。
  • 如果目标是反转它接收到的数组的内容,第一个不会“工作”。相反,它所做的是将其内容替换为数字1,通过数组的长度反向,消除其原始内容。例如,["a", "b", "c"] 变为 [3, 2, 1]
  • .push 方法返回数组的当前length
  • 如果你推送移位的元素,你将得到相同的数组。如果你取消一个弹出的元素,同样的事情。
  • 提供一个不显示任何内容的代码 sn-p 有什么意义?

标签: javascript arrays iteration


【解决方案1】:

关于您的代码的第二个版本

首先,请注意pop 方法不带参数,因此传递它i 没有额外的效果。

然后举一个你可能传递给这个函数的数组的例子:

 ['a', 'b', 'c', 'd']

在每次迭代中,您从数组中弹出最后一个元素,并使用以下语句将其移回前面(我删除了 i):

 array.unshift(array.pop());

这是循环的 4 次迭代中发生的情况:

 ['d', 'a', 'b', 'c']
 ['c', 'd', 'a', 'b']
 ['b', 'd', 'a', 'b']
 ['a', 'b', 'c', 'd']

...你的背部与你开始时使用的相同。

在您的代码的第一个版本中

请注意,shiftpush 的顺序似乎错误,以防有任何用处。此外,push 将参数作为要添加到数组末尾的值,但您传递的是索引,而不是数组中的值:

array.shift(array.push(i));

移位然后取出第一个元素,它的值是......丢失。

这就是迭代中发生的事情:

['b', 'c', 'd', 4]
['c', 'd', 4, 3]
['d', 4, 3, 2]
[4, 3, 2, 1]

因此,这也不会反转您的数组(仅当您碰巧传递了它[1, 2, 3, 4],但正如您所见,这纯属偶然)。

如果您像这样交换shiftpush

array.push(array.shift());

代码会更有意义,因为您实际上会从数组中取出第一个值并在最后将其添加回。但就像代码的第二个版本一样,你最终会得到原始数组。您只需循环元素而不更改它们的顺序。

如何反转

您可以从数组的两个远端开始交换值,然后向内工作。我将在这里使用 ES6 解构赋值语法进行交换:

function reverseArrayInPlace(array) {
  for (var i = array.length - 1, j = 0; i > j; i--, j++) {
    [array[i], array[j]] = [array[j], array[i]];
  }
}
// Demo:
var array = ['a','b','c','d'];
reverseArrayInPlace(array);
console.log(array); // ['d','c','b','a']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 2017-07-17
    • 2021-11-17
    • 2019-04-17
    • 1970-01-01
    • 2020-09-04
    • 2020-09-15
    相关资源
    最近更新 更多