我已经创建了一个简单的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]
Run Code Online (Sandbox Code Playgroud)
您必须在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)
Run Code Online (Sandbox Code Playgroud)
正如我们在评论中讨论的那样,最好的方法是实现类似map函数: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)
Run Code Online (Sandbox Code Playgroud)
这样myArray没有触及,你创建一个新的.这通常是最好的选择,但有时你可能想要在适当的位置修改它,因为它很大或者其他(好的?)原因.在这种情况下,您可以使用第一个选项.
您应该分配新的数组元素值,因为原始类型(如您的情况下的数字)是不可变的,因此element * 2不会修改element.
要完成这项工作,您不应该触及当前的forEach实现,因为forEach不应该从回调返回值(这不是映射)。在这种情况下,您应该执行以下操作:
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 ));Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
803 次 |
| 最近记录: |