如何在 javascript 中修改函数内部的全局变量,即就地修改变量
How to modify a global variable inside a function in javascript, i.e. modify variable in-place
因此,您可以在下面找到我针对 Leetcode's challenge 189 'Rotate Array' 的(非常基本且未优化的)解决方案。
本次挑战的目标如下:给定一个数组,将数组向右旋转 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
。但是原来的引用nums
没变
您实际上应该更改 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 循环。
因此,您可以在下面找到我针对 Leetcode's challenge 189 'Rotate Array' 的(非常基本且未优化的)解决方案。 本次挑战的目标如下:给定一个数组,将数组向右旋转 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
。但是原来的引用nums
没变
您实际上应该更改 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 循环。