在javascript中反转数组

时间:2017-04-19 04:44:10

标签: javascript arrays scope

我有一个名为reverseArray的Javascript函数,它接受一个数组作为参数,并返回一个新的数组,该数组的值与输入数组的顺序相反。我想创建一个名为reverseArryInPlace的函数,它将输入数组的值更改为相反的顺序。

function reverseArray(inputArray) {
  var outputArray = [];
  for (var i = inputArray.length - 1; i >= 0; i--)
    outputArray.push(inputArray[i]);
  return outputArray;
}

function reverseArrayInPlace(inPlaceInputArray) {
  inPlaceInputArray = reverseArray(inPlaceInputArray);
  console.log('Inside reverseArrayInPlace: ' + inPlaceInputArray);
  return inPlaceInputArray;
}

var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log('Outside reverseArrayInPlace: ' + arrayValue);
// Expected Value: [5, 4, 3, 2, 1]

这是我执行这段代码时得到的结果:

Inside reverseArrayInPlace: 5,4,3,2,1
Outside reverseArrayInPlace: 1,2,3,4,5

在reverseArrayInPlace函数中,arrayValue变量已按预期反转。为什么当我在reverseArrayInPlace函数之外引用相同的变量时,它又恢复到原始顺序?

4 个答案:

答案 0 :(得分:3)

如果要将其反转到位,则必须将其反转。



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

const a = [1,2,3,4,5];
reverseArrayInPlace(a);
console.log(a);
&#13;
&#13;
&#13;

答案 1 :(得分:2)

这里的根本问题是原语在JavaScript中按值传递。有关详细信息,请参阅以下问题:

Javascript by reference vs. by value

作为一个简单的例子,这是一个试图改变传递给它的字符串的函数:

var outsideValue = 'foo'

function mutate(value) {
  value = 'fish'
}

mutate(outsideValue);
console.log(outsideValue);

但是,控制台输出为foo

这是因为value函数中的mutate变量是一个在最初调用函数时引用outsideValue的变量。在函数体中为其赋值时,它只会更改value变量以引用新字符串。因此,outsideValue未受影响。

检查此答案以获取反转的示例:

https://stackoverflow.com/a/43486686/249933

请注意,它不会重新分配函数参数。

答案 2 :(得分:0)

正如其他人所说,数组是对象,因此它们通过引用传递。您必须修改原始数组,而不是创建新数组。

所以这是 reverseInPlace 的另一个版本,它使用 shift 从数组中删除最后一个元素,并使用 splice 将其插入到新的位置:

function reverseInPlace(arr) {
  var i = arr.length;
  while (i--) {
    arr.splice(i, 0, arr.shift());
  }
}

var arr = [1,2,3,4,5];
console.log('Before: ' + arr.join());

reverseInPlace(arr);
console.log('After:  ' + arr.join());

为了获得乐趣,您还可以利用 sort

NB :这仅适用于某些浏览器,它依赖于依赖于实现的内置排序算法。

function reverseInPlace(arr) {
  arr.sort(() => 1);
}

var arr = [47, 95, 80, 62, 8, 34, 31, 17, 62, 17, 85, 72, 51, 20, 68, 60, 30, 84, 7, 34];
console.log('Before: ' + arr.join());

reverseInPlace(arr);
console.log('After : ' + arr.join());

答案 3 :(得分:-1)

function reverseArray(inputArray) {
  var outputArray = [];
  for (var i = inputArray.length - 1; i >= 0; i--)
    outputArray.push(inputArray[i]);
  return outputArray;
}

function reverseArrayInPlace(inPlaceInputArray) {
  inPlaceInputArray = reverseArray(inPlaceInputArray);
  console.log('Inside reverseArrayInPlace: ' + inPlaceInputArray);
  return inPlaceInputArray;
}
var arrayValue = [1, 2, 3, 4, 5];
**arrayValue = reverseArrayInPlace(arrayValue);**
alert('Outside reverseArrayInPlace: ' + arrayValue);
// Expected Value: [5, 4, 3, 2, 1]

//

你的代码是正确的你需要更换一行并写  arrayValue = reverseArrayInPlace(arrayValue); 代替 reverseArrayInPlace(arrayValue); 然后arratValue将打印预期值