【问题标题】:Multiply by number all ellements of an array with forEach in JavaScript用 JavaScript 中的 forEach 将数组的所有元素乘以数字
【发布时间】:2015-03-17 22:35:15
【问题描述】:

我有一个数字数组:

var array = [ 23, 67, 120, 170, 200, 212, 350 ];

我想将数组的每个元素按比例缩小 20%。

我使用了array.forEach(function(item) {item * 0.8;});,但它什么也没做。我也试过var scaledArray = array.forEach(function(item) {item * 0.8;});,但结果是不确定的。

【问题讨论】:

  • 你检查过 underscore.js 吗?您可以映射数组元素。
  • .forEach(function() { <code> }) 基本上等价于for(...) { <code> }。您将两个数字相乘,但您没有对结果做任何事情。它不会神奇地为你做点什么。
  • @dustmouse 从答案中可以看出,map 是本机 JavaScript 中一个相当广泛可用的函数,现在不使用库。链接页面还有一个 polyfill,适用于本机不支持它的浏览器。
  • @詹姆斯索普。 IE 8 及以下版本的一些旧浏览器不支持原生数组映射功能。为什么不使用诸如 underscore.js 之类的文档齐全且相对标准的库来处理浏览器兼容性/实现细节以及提供大量其他功能?
  • @dustmouse 这就是 polyfill 的作用。它为缺少它们的浏览器填充实现。

标签: javascript arrays foreach


【解决方案1】:

forEach 对数组中的每个元素调用提供的函数;它不会返回具有修改值的新数组(来自对每个元素调用提供的函数)。你要使用的是map:

array = array.map(function(element) {
    return element * 0.8;
});

这将根据您提供的映射函数映射数组的每个元素,并返回一个包含这些映射值的新数组。

如果您想保留原始数组,您可以简单地将map 的结果分配给不同的变量:

var scaledArray = array.map(function(element) {
    return element * 0.8;
});

可以使用forEach 进行这两项操作,例如:

array.forEach(function(element, index, _array) {
    _array[index] = element * 0.8;
});

和:

var scaledArray = [];
array.forEach(function(element, index) {
    scaledArray[index] = element * 0.8;
});

但我相信你会同意map 版本更加优雅和惯用。

【讨论】:

  • 请理解作者解释的差异不仅提供了解决方案。 +1
  • foreach 的第三个参数是数组本身,因此您可以使用它而不是从外部引用它。
【解决方案2】:

下面是使用forEach的方法:

var array = [ 23, 67, 120, 170, 200, 212, 350 ]

array.forEach(function(val, idx) {
  array[idx]= val * 0.8;
});

alert(array.join('\r'));

Array.prototype.map() 通常是更直接的解决方案,但实际上可能比Array.prototype.forEach() 慢,因为forEach 可以就地修改数组:

http://jsperf.com/foreach-v-map

【讨论】:

    【解决方案3】:

    使用map 代替forEach

    var arr = array.map(function(item) {return item * 0.8;})
    

    map 方法使用调用结果创建一个新数组 在此数组中的每个元素上提供函数,forEach 不会创建新数组。

    【讨论】:

    • 我同意,最好如下array.map(item => item * 0.8)
    【解决方案4】:

    您可以直接使用map但如果您想使用forEach,请注意:

    • .forEach(function() { <code> }) 等价于 (...) { <code> }.

    您正在乘以数字,但没有对这些数字做任何事情。您可以更改您正在处理的实际数组,但应该将该操作分配给数组。 (我还添加了 .toFixed(2) 以将结果四舍五入到小数点后 2 位,因为结果是 string,所以在整个结果中添加了 Number()。

    let array = [ 23, 67, 120, 170, 200, 212, 350 ];
    array.forEach ( function(x,i) {
    array[i] = (x * .8).toFixed(2);
    console.log(array); 
    });
    

    【讨论】:

      猜你喜欢
      • 2013-11-05
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      相关资源
      最近更新 更多