如何在javascript中修改函数内部的全局变量,即就地修改变量



因此,您可以在下面找到我的(非常基本且未优化的(Leetcode挑战189"旋转阵列"的解决方案。这个挑战的目标如下:给定一个数组,将数组向右旋转k步,其中k是非负的。

现在,我的解决方案不被接受,因为在函数调用后,全局变量nums保持不变。为什么?不知何故,nums被视为局部变量,并且不会更改传入的全局变量nums。我知道这可能是因为javascript处理变量作用域的方式,但我似乎找不到可以帮助我理解这个例子的资源。

/**
* @param {number[]} nums
* @param {number} k
* @return {void} Do not return anything, modify nums in-place instead.
*/
var rotate = function(nums, k) {
array2 = Array.from(nums)
nums.map((num) => {
array2[(nums.indexOf(num)+k)%nums.length] = num
})
nums = Array.from(array2)
console.log(nums) // returns expected answer
};
Your input
[1,2,3,4,5,6,7]
3
Your stdout
[5,6,7,1,2,3,4]
Your answer
[1,2,3,4,5,6,7]
Expected answer
[5,6,7,1,2,3,4]

map函数不会修改原始数组。此外,您似乎使用错误。

您正在使用map设置array2的值,然后将nums设置为array2的副本。这不会修改nums中包含的原始对象。

当然,如果您在函数中记录nums,它会给您更新的值,但该值的范围在函数中,不能在外部访问。

对于这种类型的不纯编程,应该使用for循环,而不是数组方法。

var rotate = function(nums, k) {
array2 = Array.from(nums);
for (const i in nums) nums[i] = array2[(i+k)%nums.length];
};

您的方法是正确的,但问题是:

var rotate = function(nums, k) {
array2 = Array.from(nums)
nums.map((num) => {
array2[(nums.indexOf(num)+k)%nums.length] = num //Making changed to array2
})
nums = Array.from(array2) //Completely changing the reference of nums
console.log(nums) // returns expected answer
};
let nums =  [1,2,3,4,5,6,7];
rotate(nums,3); 
console.log(nums); //Original nums still as it is

如果您查看上面的代码,nums实际上并没有改变。原因是您正在创建一个全新的数组array2。在.map()中,您正在对其进行各种更改,并将其重新分配给nums。但是原始CCD_ 12的引用没有改变。

实际上,您应该对nums进行更改,并使用array2获得帮助:

var rotate = function(nums, k) {
array2 = Array.from(nums)
array2.forEach((num) => {
nums[(array2.indexOf(num)+k)%array2.length] = num
})
console.log(nums) // returns expected answer
};
let nums =  [1,2,3,4,5,6,7];
rotate(nums,3);
console.log(nums);

PS:.map()是您想要返回一个新的转换数组的时候。否则,您可以简单地使用.forEach或for循环。

最新更新