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

时间:2019-06-03 12:48:51

标签: javascript

我正在研究数据结构,显然不了解引用的工作原理。

我试图在不创建新数组的情况下反转数组。因此,我认为我需要将值之一存储在局部变量中(在这种情况下为x),但即使这样,它也不会更新。

Person, Trip,Origin, Destination
1,1,US, Japan
1,2,Japan, US,
2,1,China, US
2,2, US, Japan
2,3, Japan, China

我的预期结果应该是任何颠倒的数组。

//→[5,4,3,2,1]

但是我只是得到

//→[1、2、3、4、5]

4 个答案:

答案 0 :(得分:2)

您应将要替换的值存储在x中,如下所示:

let x = arr[arr.length - 1 - i];

...然后将其替换(即:执行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);

答案 1 :(得分:1)

由于您正在使用let,所以我假设您正在使用ES2015功能。您可以使用destructuringswap个数组项。

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);

答案 2 :(得分:0)

您可以尝试使用:

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;
}

答案 3 :(得分:0)

您的问题很少。

首先,您需要将存储在x中,而不是 index 中。如果要交换值,则将覆盖两个值之一,这就是为什么需要它的副本。

第二,行arr[i] = arr[x]不正确-arr[x]x = i的行实际上只是arr[i] = arr[i]。同样,如前所述,该值将被覆盖,因此您要保存一个值并将 that 分配给新位置,否则,您将链接到覆盖的值并在两个位置都将其复制。

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);