例子:
var arr = ["one","two","three"];
arr.forEach(function(part){
part = "four";
return "four";
})
alert(arr);
数组仍然是它的原始值,有任何方法来写访问数组的元素从迭代函数?
例子:
var arr = ["one","two","three"];
arr.forEach(function(part){
part = "four";
return "four";
})
alert(arr);
数组仍然是它的原始值,有任何方法来写访问数组的元素从迭代函数?
当前回答
回调函数传递元素、索引和数组本身。
arr.forEach(function(part, index, theArray) {
theArray[index] = "hello world";
});
edit -正如注释中所指出的,.forEach()函数可以接受第二个参数,它将在每次调用回调时用作this的值:
arr.forEach(function(part, index) {
this[index] = "hello world";
}, arr); // use arr as this
第二个例子显示了在回调中arr本身是这样设置的。有人可能会认为.forEach()调用中涉及的数组可能是this的默认值,但不管出于什么原因,它不是;如果没有提供第二个参数,则没有定义。
(注意:如果回调函数是=>函数,上述内容并不适用,因为在调用此类函数时,它从未绑定到任何东西。)
同样重要的是要记住,Array原型上提供了一整套类似的实用程序,并且Stackoverflow上出现了许多关于某个函数或另一个函数的问题,因此最好的解决方案就是选择一个不同的工具。你有:
forEach用于对数组中的每个条目执行操作; 用于生成只包含符合条件的项的新数组的过滤器; 映射,通过转换现有数组来创建一个一对一的新数组; 一些用于检查数组中是否至少有一个元素符合某些描述; each用于检查数组中的所有条目是否与描述匹配; Find用于在数组中查找值
等等。MDN链接
其他回答
Javascript是按值传递的,这本质上意味着部分是数组中值的副本。
要更改该值,请在循环中访问数组本身。
Arr [index] = '新值';
下面是使用=>样式函数的类似答案:
var data = [1,2,3,4];
data.forEach( (item, i, self) => self[i] = item + 10 );
给出结果:
[11,12,13,14]
self参数对于箭头样式函数并不是严格必要的,所以
data.forEach( (item,i) => data[i] = item + 10);
同样适用。
如果您想删除项目
如果您需要做的更改是完全从列表中删除一个或多个项目,那么使用for循环并向后执行循环会更安全。
for (let i = myArray.length - 1; i >= 0; i--)
{
const item = myArray[i];
if (...)
{
// remove item
// https://stackoverflow.com/questions/5767325/how-can-i-remove-a-specific-item-from-an-array?rq=1
}
};
向后意味着每个项的数组永远不会改变。如果你继续循环并删除项目[3],那么项目[4]现在是新的项目[3],这不会让任何事情变得更容易。你不会让这个问题倒退。
这当然是一个不使用foreach的解决方案,但重要的是要记住,“老派”的方法往往是最好的。如果出于某种原因你需要分手;在循环中(有很多项),for循环更有效,因为不能跳出for循环。
如果你想重写,你可以试试这个
var newArray= [444,555,666];
var oldArray =[11,22,33];
oldArray.forEach((name, index) => oldArray [index] = newArray[index]);
console.log(newArray);
回调函数传递元素、索引和数组本身。
arr.forEach(function(part, index, theArray) {
theArray[index] = "hello world";
});
edit -正如注释中所指出的,.forEach()函数可以接受第二个参数,它将在每次调用回调时用作this的值:
arr.forEach(function(part, index) {
this[index] = "hello world";
}, arr); // use arr as this
第二个例子显示了在回调中arr本身是这样设置的。有人可能会认为.forEach()调用中涉及的数组可能是this的默认值,但不管出于什么原因,它不是;如果没有提供第二个参数,则没有定义。
(注意:如果回调函数是=>函数,上述内容并不适用,因为在调用此类函数时,它从未绑定到任何东西。)
同样重要的是要记住,Array原型上提供了一整套类似的实用程序,并且Stackoverflow上出现了许多关于某个函数或另一个函数的问题,因此最好的解决方案就是选择一个不同的工具。你有:
forEach用于对数组中的每个条目执行操作; 用于生成只包含符合条件的项的新数组的过滤器; 映射,通过转换现有数组来创建一个一对一的新数组; 一些用于检查数组中是否至少有一个元素符合某些描述; each用于检查数组中的所有条目是否与描述匹配; Find用于在数组中查找值
等等。MDN链接