forEach不会改变我传入的数组

时间:2015-05-08 15:37:18

标签: 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]

4 个答案:

答案 0 :(得分: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)

正如我们在评论中讨论的那样,最好的方法是实现地图功能: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)

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

答案 1 :(得分:4)

您应该分配新的数组元素值,因为基本类型(例如您的数字)是不可变的,因此element * 2不会修改element

为了完成这项工作,你不应该触及你当前的forEach实现,因为forEach不应该从回调中返回值(这不是map)。在这种情况下,你应该这样做:

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 ));

答案 2 :(得分:1)

是的,答案不对。这个[片段]会这样做。

无论如何,在现代浏览器中,我们有REPavailability

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{QUERY_STRING} name=News&file=article&sid=60
RewriteRule ^phpnuke/modules\.php$ /? [L,R=301]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Array.forEach

答案 3 :(得分:1)

这应该有效,明确指定变量。

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

var myArray = [1,2,3]
forEach(myArray,function(element){return element*2})
console.log(myArray)///[1,2,3]