我有一个名为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函数之外引用相同的变量时,它又恢复到原始顺序?
答案 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;
答案 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将打印预期值