[英]Switching objects in an array without making a new array
我正在研究数据结构,并且显然没有掌握引用的工作原理。
我正在尝试不创建新数组而反转数组。 因此,我认为我需要将值之一存储在局部变量中(在这种情况下为x),但即使这样,它也不会更新。
function reverseArrayInPlace(arr){ for (var i = 0; i < Math.floor(arr.length / 2); i++){ let x = i; arr[arr.length - 1 - i] = arr[i]; arr[i] = arr[x]; } return arr; } let arrayValue = [1, 2, 3, 4, 5]; reverseArrayInPlace(arrayValue); console.log(arrayValue);
我的预期结果应该是任何反转数组。
//→[5,4,3,2,1]
但我只是得到
//→[1、2、3、4、5]
您应该像下面这样将要替换的值存储在x
:
let x = arr[arr.length - 1 - i];
...然后替换它(即:do arr[arr.length - 1 - i] = arr[i]
),然后使用x
(刚替换的值)将arr[i]
的值设置为“交换” “这两个价值观
请参见下面的示例:
function reverseArrayInPlace(arr){ for (var i = 0; i < Math.floor(arr.length / 2); i++){ let x = arr[arr.length - 1 - i]; arr[arr.length - 1 - i] = arr[i]; arr[i] = x; } return arr; } let arrayValue = [1, 2, 3, 4, 5]; reverseArrayInPlace(arrayValue); console.log(arrayValue);
由于您正在使用let
,因此我假设您正在使用ES2015功能。 您可以使用解构来交换数组项。
function reverseArrayInPlace(arr){ for (var i = 0; i < Math.floor(arr.length / 2); i++){ [arr[arr.length - 1 - i], arr[i]] = [arr[i], arr[arr.length - 1 - i]] } return arr; } let arrayValue = [1, 2, 3, 4, 5]; reverseArrayInPlace(arrayValue); console.log(arrayValue);
您可以尝试使用:
function reverseArrayInPlace(arr){
for (var i = 0; i < Math.floor(arr.length / 2); i++){
let temp = arr[i];
arr[i] = arr[arr.length - i - 1];
arr[arr.length - i - 1] = temp;
}
return arr;
}
你有几个问题。
首先,您需要将值存储在x
,而不是index中 。 如果交换值,那么将覆盖两个值之一,这就是为什么需要它的副本。
其次,线arr[i] = arr[x]
是不正确的x = i
arr[x]
实际上只是arr[i] = arr[i]
。 此外,如前所述,该值将被覆盖,因此你想的那么保存的值,并分配到新的位置,否则就会链接到覆盖值,只是重复它在这两个地方。
function reverseArrayInPlace(arr){ for (var i = 0; i < Math.floor(arr.length / 2); i++){ //arr[arr.length - 1 - i] will be overwritten, so saving that value as x let x = arr[arr.length - 1 - i]; //overwrite the the value arr[arr.length - 1 - i] = arr[i]; //swap the old value to a new position arr[i] = x; } return arr; } let arrayValue = [1, 2, 3, 4, 5]; reverseArrayInPlace(arrayValue); console.log(arrayValue);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.