繁体   English   中英

在不创建新数组的情况下切换数组中的对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM