JS foreach循环更新数组元素

时间:2017-12-30 00:15:29

标签: javascript

我目前正在学习JavaScript。 我尝试使用foreach循环来更新数组中的元素。 但问题是“console.log”结果总是和以前一样。 下面是代码。 任何人都可以帮忙解决问题吗?

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
];

var addNum = function(element,index,array){
    if(element%3===0)
    {
        element += 100;
    }
};

test.forEach(addNum);
console.log(test);

2 个答案:

答案 0 :(得分:4)

那是因为在JavaScript中,参数是按值传递的,而不是通过引用传递的 所以改变element参数什么都不做。

在您的情况下,最好使用map,如下所示:

var addNum = function(element,index,array){
    if(element%3===0)
    {
        return element + 100;
    }

    return element
};

const result = test.map(addNum);
console.log(result);

如果你真的需要使用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
];

var addNum = function(element,index,array){
    if(element%3===0)
    {
        array[index] += 100;
    }
};

test.forEach(addNum);
console.log(test);

但在我看来,这是一种不好的做法 forEach用于对数组中的每个元素执行某些操作而不更改它,但map专门用于创建在所提供数组的每个元素上运行函数的新数组。
另请参阅此处的讨论Is there a difference between foreach and map?

答案 1 :(得分:2)

addNum函数中,element只是一个参数。修改它时,只修改函数内部的值,而不是数组中的实际元素。

要修改数组,您需要定位元素:

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
];

var addNum = function(element, index, array) {
    if (element % 3 === 0) {
        array[index] = element + 100;
    }
};
test.forEach(addNum);
console.log(test);

请注意,在JavaScript中,您可以直接将匿名函数传递给forEach()

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