【问题标题】:How to change an array passed to a function without iterating through its items in javascript如何更改传递给函数的数组而不在javascript中迭代其项目
【发布时间】:2015-12-14 14:37:52
【问题描述】:

我有一个函数,它接受一个数组作为它的第一个参数。在这个函数中,构造了第二个数组。我希望将传递的数组替换为新数组。是否可以更改原始数组而不一一更改其项目?

var myFunct=function(arr){
   var arr2=[];
   for(var i=0;i<arr.length;i++)
      arr2.push(2 * arr[i]);
   arr=arr2;
}
var arr=[1,2,3];
myFunc(arr);
console.log(arr);
//displays [1,2,3] not the desired [2,4,6];

如果我更改函数以使arr 的所有项目单独更改,该函数将按我的意愿运行。为什么会这样?是否可以通过简单地将 arr 分配给新数组来更改它?

//works fine
var myFunct=function(arr){
   var arr2=[];
   for(var i=0;i<arr.length;i++)
      arr2.push(2 * arr[i]);
   //arr=arr2;
   for(var i=0;i<arr.length;i++)
      arr[i]=arr2[i];   
}

【问题讨论】:

    标签: javascript arrays function arguments pass-by-reference


    【解决方案1】:

    是否要求您就地进行变异?为什么不直接返回新数组?

    var arr = [1, 2, 3];
    
    function myFunc(a) {
      return a.map(item => item*2);
    }
    
    arr = myFunc(arr);
    
    console.log(arr); // [2, 4, 6]

    直接回答:不,你不能那样做。函数内部的arr 指的是函数内部 的局部变量。为了在函数外部更改该数组的内容,您需要单独更新其条目。

    【讨论】:

    • 这个函数已经存在并返回另一个值,所以我更喜欢更改传递的变量
    • @ormoz 在这种情况下,您可以轻松地执行 var arr = myFunc([1, 2, 3])...map 函数对于您的目的来说是理想的,而您只是在挑剔它的事实是副本...
    • @ormoz 我对你的评论感到困惑;如果函数已经存在,你打算如何改变它的行为?
    • 谢谢@Mathletics 它已经存在另一个原因,但是现在,我想从这个函数中获取新计算的数组(避免编写一个新函数来计算arr
    • 是的,我还是不明白你在做什么。
    猜你喜欢
    • 2019-01-23
    • 2020-07-08
    • 2020-05-24
    • 1970-01-01
    • 2015-04-15
    • 2015-02-28
    • 2016-07-20
    • 2017-01-17
    • 1970-01-01
    相关资源
    最近更新 更多