繁体   English   中英

如何在 javascript 中的 function 中修改全局变量,即就地修改变量

[英]How to modify a global variable inside a function in javascript, i.e. modify variable in-place

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

现在,我的解决方案不被接受,因为在 function 调用之后,全局变量 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 function 不修改原始数组。 此外,您似乎使用不正确。

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

当然,如果您在 function 中记录nums ,它会为您提供更新的值,但此值在 function 范围内,无法在外部访问。

对于这种不纯的编程,您应该使用 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 循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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