【问题标题】:JS foreach loop to update an array elementJS foreach循环更新数组元素
【发布时间】:2018-06-10 07:36:19
【问题描述】:

我目前正在学习 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);

【问题讨论】:

    标签: javascript


    【解决方案1】:

    这是因为在 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?

    【讨论】:

    • 是的,也许回答的人在一秒钟前被删除了
    • 我可以在 FireFox 57 上成功运行的较短版本是: const result= test.map(i=>i%3===0? i+100: i);
    • 为什么使用forEach 是个坏习惯?有任何参考支持吗?
    • 更改原始数组的值不是副作用,而是在该上下文中使用forEach 的实际目的。 OP 从未明确表示他们想要修改原始数组的浅拷贝,而不是原始数组本身。称之为不好的做法,因为这至少是错误的信息。
    • 在你看来;这就是我想要表达的观点。它不像编程世界一般认为使用forEach 是不好的做法。在向不熟悉该语言的人讲话时,您必须小心措辞。此外,update my elements in an array 听起来像是 OP 想要修改原始数组。
    【解决方案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;
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-15
      • 2020-11-26
      • 2020-05-30
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      相关资源
      最近更新 更多