例子:
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);
数组仍然是它的原始值,有任何方法来写访问数组的元素从迭代函数?
当前回答
foreach函数可以有一个回调函数(eachelement, elementIndex) 所以基本上你需要做的是:
arr.forEach(function(element,index){
arr[index] = "four"; //set the value
});
console.log(arr); //the array has been overwritten.
或者,如果您想保留原始数组,可以在执行上述过程之前对其进行复制。 要制作副本,您可以使用:
var copy = arr.slice();
其他回答
如果你想重写,你可以试试这个
var newArray= [444,555,666];
var oldArray =[11,22,33];
oldArray.forEach((name, index) => oldArray [index] = newArray[index]);
console.log(newArray);
foreach函数可以有一个回调函数(eachelement, elementIndex) 所以基本上你需要做的是:
arr.forEach(function(element,index){
arr[index] = "four"; //set the value
});
console.log(arr); //the array has been overwritten.
或者,如果您想保留原始数组,可以在执行上述过程之前对其进行复制。 要制作副本,您可以使用:
var copy = arr.slice();
使用Array对象方法,您可以修改Array内容,但与基本的for循环相比,这些方法缺少一个重要的功能。不能在运行中修改索引。
例如,如果您要删除当前元素并将其放在同一数组中的另一个索引位置,您可以轻松地做到这一点。如果您将当前元素移动到之前的位置,那么在下一次迭代中,您将得到相同的下一项,就像您什么都没有做一样。
考虑这段代码,当索引数达到5时,我们将索引位置5的项移动到索引位置2。
var ar = [0,1,2,3,4,5,6,7,8,9];
ar.forEach((e,i,a) => {
i == 5 && a.splice(2,0,a.splice(i,1)[0])
console.log(i,e);
}); // 0 0 - 1 1 - 2 2 - 3 3 - 4 4 - 5 5 - 6 6 - 7 7 - 8 8 - 9 9
但是,如果我们将当前元素移动到当前索引位置以外的位置,事情就会变得有点混乱。然后下一个项目将移动到移动项目的位置,在下一次迭代中,我们将无法看到或计算它。
考虑这段代码,当索引数达到5时,我们将索引位置5的项移动到索引位置7。
var a = [0,1,2,3,4,5,6,7,8,9];
a.forEach((e,i,a) => {
i == 5 && a.splice(7,0,a.splice(i,1)[0])
console.log(i,e);
}); // 0 0 - 1 1 - 2 2 - 3 3 - 4 4 - 5 5 - 6 7 - 7 5 - 8 8 - 9 9
所以我们在这个圈子里从来没有见过6个人。通常在for循环中,当向前移动数组项时,需要递减索引值,以便下次运行时索引保持在相同的位置,并且仍然可以计算移到已删除项位置的项。这对于数组方法是不可能的。您不能更改索引。检查以下代码
var a = [0,1,2,3,4,5,6,7,8,9];
a.forEach((e,i,a) => {
i == 5 && (a.splice(7,0,a.splice(i,1)[0]), i--);
console.log(i,e);
}); // 0 0 - 1 1 - 2 2 - 3 3 - 4 4 - 4 5 - 6 7 - 7 5 - 8 8 - 9 9
如你所见,当我们递减i时,它不会从5开始,而是从6开始。
记住这一点。
让我们尽量保持简单,并讨论它是如何实际工作的。它与变量类型和函数参数有关。
下面是我们正在讨论的代码:
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);
将其替换为数组的索引。
array[index] = new_value;