例子:
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);
数组仍然是它的原始值,有任何方法来写访问数组的元素从迭代函数?
当前回答
如果您想删除项目
如果您需要做的更改是完全从列表中删除一个或多个项目,那么使用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循环。
其他回答
将其替换为数组的索引。
array[index] = new_value;
Javascript是按值传递的,这本质上意味着部分是数组中值的副本。
要更改该值,请在循环中访问数组本身。
Arr [index] = '新值';
让我们尽量保持简单,并讨论它是如何实际工作的。它与变量类型和函数参数有关。
下面是我们正在讨论的代码:
var arr = ["one","two","three"];
arr.forEach(function(part) {
part = "four";
return "four";
})
alert(arr);
首先,这里是你应该阅读关于Array.prototype.forEach()的地方:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
其次,让我们简要地讨论一下JavaScript中的值类型。
基本类型(未定义,空,字符串,布尔,数字)存储一个实际值。
var x = 5;
引用类型(自定义对象)存储对象的内存位置。
例如:var xObj = {x: 5};
第三,函数参数是如何工作的。
在函数中,参数总是按值传递。
因为arr是一个字符串数组,它是一个基本对象数组,这意味着它们是按值存储的。
所以对于上面的代码,这意味着每次forEach()迭代时,part都等于arr[index]的相同值,但不是同一个对象。
Part = "four";改变部分变量,但不改变arr。
下面的代码将改变你想要的值:
var arr = ["one","two","three"];
arr.forEach(function(part, index) {
arr[index] = "four";
});
alert(arr);
现在,如果数组arr是一个引用类型的数组,下面的代码将工作,因为引用类型存储的是对象的内存位置,而不是实际对象。
var arr = [{ num : "one" }, { num : "two"}, { num : "three"}];
arr.forEach(function(part, index) {
// part and arr[index] point to the same object
// so changing the object that part points to changes the object that arr[index] points to
part.num = "four";
});
alert(arr[0].num);
alert(arr[1].num);
alert(arr[2].num);
下面的例子说明了你可以改变part来指向一个新的对象,同时保留存储在arr中的对象:
var arr = [{ num : "one" }, { num : "two"}, { num : "three"}];
arr.forEach(function(part, index) {
// the following will not change the object that arr[index] points to because part now points at a new object
part = 5;
});
alert(arr[0].num);
alert(arr[1].num);
alert(arr[2].num);
数组:[1,2,3,4] 结果:["foo1", "foo2", "foo3", "foo4"]
保持原始数组
const originalArr = ["Iron", "Super", "Ant", "Aqua"]; const modifiedArr = originalArr。Map (name => ' ${name}man '); console.log("Original: %s", originalArr); console.log("Modified: %s", modifiedArr);
覆盖原始数组
let originalArr =["铁","超级","蚂蚁","水"]; originalArr = originalArr。Map (name => ' ${name}man '); console.log("Original: %s", originalArr);
重写原始数组
const originalArr = ["Iron", "Super", "Ant", "Aqua"]; originalArr。forEach((name, index) => originalArr[index] = ' ${name}man '); console.log("被覆盖:%s", originalArr);
下面是使用=>样式函数的类似答案:
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);
同样适用。