forEach不会改变我传入的数组

Tom*_*own 4 javascript

我已经创建了一个简单的forEach函数,我试图理解为什么,当我运行它时myArray,即使我运行它也不会改变数组element*2.

function forEach(array, callback) {
  for (var i = 0; i < array.length; i++) {
    callback(array[i],i,array)
  };
}

var myArray = [1,2,3]
forEach(myArray,function(element){element*2})
console.log(myArray)///[1,2,3]
Run Code Online (Sandbox Code Playgroud)

Mar*_*ger 6

您必须在for循环中修改数组,如下所示:

function forEach(array, callback) {
  for (var i = 0; i < array.length; i++) {
    array[i] = callback(array[i],i,array)
  };
}

var myArray = [1,2,3]
forEach(myArray,function(element){return element*2})
console.log(myArray)
Run Code Online (Sandbox Code Playgroud)

正如我们在评论中讨论的那样,最好的方法是实现类似map函数:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/map

function map(array, callback) {
  var out = [];
  for (var i = 0; i < array.length; i++) {
    out.push(callback(array[i],i,array))
  };

  return out;
}

var myArray = [1,2,3]
var myOtherArray = map(myArray,function(element){return element*2})
console.log(myArray)
console.log(myOtherArray)
Run Code Online (Sandbox Code Playgroud)

这样myArray没有触及,你创建一个新的.这通常是最好的选择,但有时你可能想要在适当的位置修改它,因为它很大或者其他(好的?)原因.在这种情况下,您可以使用第一个选项.


dfs*_*fsq 5

您应该分配新的数组元素值,因为原始类型(如您的情况下的数字)是不可变的,因此element * 2不会修改element.

要完成这项工作,您不应该触及当前的forEach实现,因为forEach不应该从回调返回值(这不是映射)。在这种情况下,您应该执行以下操作:

function forEach(array, callback) {
  for (var i = 0; i < array.length; i++) {
    callback(array[i], i, array);
  }
}

var myArray = [1,2,3];
forEach(myArray, function(element, i, arr) { 
  arr[i] = element * 2;
});

document.write(JSON.stringify( myArray ));
Run Code Online (Sandbox Code Playgroud)