为啥我的 forEach 循环没有编辑我的数组? [复制]

Posted

技术标签:

【中文标题】为啥我的 forEach 循环没有编辑我的数组? [复制]【英文标题】:Why is my forEach loop not editing my array? [duplicate]为什么我的 forEach 循环没有编辑我的数组? [复制] 【发布时间】:2018-03-27 11:46:19 【问题描述】:

在我正在上课的课程中,他们举了一个使用forEach() 循环编辑数组内容的示例。

类示例:

var donuts = ["jelly donut", "chocolate donut", "glazed donut"];

donuts.forEach(function(donut) 
  donut += " hole";
  donut = donut.toUpperCase();
  console.log(donut);
);

Prints:
JELLY DONUT HOLE
CHOCOLATE DONUT HOLE
GLAZED DONUT HOLE

问题是当我尝试使用相同的技术解决测验问题时,它不会更改数组值。我相信这与if 声明有关,但他们要求我们使用它,那么他们为什么不告诉我们有问题呢?

我的代码:

/*
 * Programming Quiz: Another Type of Loop (6-8)
 *
 * Use the existing `test` variable and write a `forEach` loop
 * that adds 100 to each number that is divisible by 3.
 *
 * Things to note:
 *  - you must use an `if` statement to verify code is divisible by 3
 *  - you can use `console.log` to verify the `test` variable when you're finished looping
 */

var test = [12, 929, 11, 3, 199, 1000, 7, 1, 24, 37, 4,
    19, 300, 3775, 299, 36, 209, 148, 169, 299,
    6, 109, 20, 58, 139, 59, 3, 1, 139
];

test.forEach(function(element)
    if (element % 3 === 0)
        element += 100;
        return element
    
);

console.log(test);

我尝试过运行return 语句,但没有运气。我联系了他们的“实时帮助”,但他们的帮助不大。谁能告诉我这里没有看到什么?

【问题讨论】:

你不应该使用map吗? forEach 在这种情况下不合适。 donut 通过值而不是引用传递给回调函数。编辑 donut 只会编辑该字符串的本地副本。如果donut 是一个对象,你实际上可以改变它,因为它们是通过引用传递的。类的示例也不会更改原始数组。 return in forEach 什么都不做……无处可归 map 也不会修改数组,它会创建一个新数组。 我只是按照他们告诉我的去做。我只是跳过这个并删除问题。感谢您指出这一点!他们在这里并没有很清楚地问他们想要什么。 你可以留给未来的人学习。 【参考方案1】:

数组的forEach 方法不会修改数组,它只是迭代它。当您更改回调函数中的参数时,这也不会影响数组。此外,forEach 不会对回调的返回值做任何事情。一旦计算出要用于替换的值,就可以使用索引和数组参数进行设置,如下所示。

var test = [12, 929, 11, 3, 199, 1000, 7, 1, 24, 37, 4,
    19, 300, 3775, 299, 36, 209, 148, 169, 299,
    6, 109, 20, 58, 139, 59, 3, 1, 139
];

test.forEach(function(element, index, array)
    if (element % 3 === 0)
        element += 100;
        array[index] = element;
    
);

console.log(test);

【讨论】:

谢谢。我认为这是他们所要求的,但他们肯定不会事先解释任何这些。我真的很感激。 这个答案就目前而言还不错,但如果不提及map,它似乎非常不完整。 我觉得map 不适合这项工作,所以我没有提及它。我也不觉得 reduce 或任何其他数组迭代器方法比 forEach 做得更好,所以我把它留在那里。【参考方案2】:

您不会将每个值的引用传递给回调,而只是传递值。因此,您无需实际编辑数组即可更新本地值。

您可以通过将索引传递给回调然后编辑该索引处的值来更新数组。

test.forEach(function(element,index) 
    if (element % 3 === 0) 
        test[index] = element + 100; 
     
);

【讨论】:

【参考方案3】:

只需传递数组上的索引,它就会被修改。

var test = [12, 929, 11, 3, 199, 1000, 7, 1, 24, 37, 4,
19, 300, 3775, 299, 36, 209, 148, 169, 299,
6, 109, 20, 58, 139, 59, 3, 1, 139
];

test.forEach(function(element, index)
    if (element % 3 === 0)
        test[index] += 100;
    
);

console.log(test);

【讨论】:

其实这是不好的做法。如果你想修改数组的元素,这就是map 的作用。

以上是关于为啥我的 forEach 循环没有编辑我的数组? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 for-each 循环适用于数组? (爪哇)

Java中foreach为啥不能给数组赋值

在 foreach 循环中修改数组值

为啥我的 foreach 比我的 for 循环快? [复制]

为啥我的 console.log 没有在这里输出任何东西? [复制]

为啥我的委托只使用我的 foreach 循环中的最后一项?