【问题标题】:Array reversing function JS数组反转函数JS
【发布时间】:2018-12-18 14:52:53
【问题描述】:

一个初学者 JS 问题.. 我需要编写一个函数来反转作为函数输入的数组。 (我不能使用 reverse 方法)。

我想知道为什么会这样:

function reverseArrayInPlace(array) {
  for (let i = 0; i < Math.floor(array.length / 2); i++) {
    let old = array[i];
    array[i] = array[array.length - 1 - i];
    array[array.length - 1 - i] = old;
  }
  return array;
}
let arr = [0, 1, 2, 3, 4, 5];
console.log(reverseArrayInPlace(arr))

但这确实不是

function reverseArrayInPlace(arr) {
  let len = arr.length;
  for (counter = 0; counter < 2 * len; counter += 2) {
    arr.unshift(arr[counter]);
  }
  arr = arr.slice(0, len);
}
let b = [0, 1, 2, 3, 4, 5];
console.log(reverseArrayInPlace(b));

看起来arr = arr.slice(0,len); 部分不起作用..我想知道为什么:

b = b.slice(0,6);
[5, 4, 3, 2, 1, 0]

【问题讨论】:

  • 设置断点并查看数组中的值发生了什么。
  • console.log() 和断点是你的朋友
  • 你没有从函数返回任何东西。如果你最后return arr,你会看到它有效。
  • @LeviBerkowitz 没有“正确的方法”。 “正道”是什么意思?

标签: javascript arrays function


【解决方案1】:

如果你想改变输入数组,避免返回,使用splice

function reverseArrayInPlace(arr) {
  let len = arr.length;
  for (counter = 0; counter < 2 * len; counter += 2) {
    arr.unshift(arr[counter]);
  }
  arr.splice(len);
}
var b = [0, 1, 2, 3, 4, 5];
reverseArrayInPlace(b);
console.log(b);

编辑

如果你想做这样的事情:

console.log(reverseArrayInPlace(b));

您的函数必须返回某些内容,否则打印将始终为 undefined,即使 b 已被还原

【讨论】:

  • 这是偶然的,因为arr 被删除了。删除arr =,它仍然可以工作。
【解决方案2】:
   arr = arr.slice(0, len);

slice 返回一个新数组,该数组存储在局部变量arr 中,不会改变b,它仍然指向整个数组。要改变数组,您可以:

 arr.splice(len, len);

然后你必须return arr 记录一些有意义的东西。

【讨论】:

  • @quirimmo 不,变量是按值传递的。
  • 嗯,数组是按值传递的对象...其中值是它们的引用。因此,对arr 进行就地修改也会在函数外部对其进行更改,但arr = /* something */ 不会影响函数外部的数组。
  • 是的,这就是我的意思,抱歉阅读不当。如果他想改变输入的arr,避免返回,用splice可以直接修改
  • 那么当然如果他想做console.log(reverseArrayInPlace(b));,方法必须返回它,否则打​​印的值将永远是undefined,因为函数没有返回任何东西
【解决方案3】:

由于数组是通过复制引用传递给函数的,因此您无法从函数内部更改外部引用。

【讨论】:

  • 不确定为什么会被否决。这是准确的,并解释了原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
相关资源
最近更新 更多