使用JavaScript中的forEach将数组中所有元素乘以一个数字

4

我有一个数字数组:

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;});,但结果是undefined。


你有没有看过underscore.js?你可以映射数组元素。 - lintmouse
1
.forEach(function() { <code> })基本上等同于for(...) { <code> }。你正在将两个数字相乘,但你没有对结果做任何事情。它不会自动为你执行任何操作。 - Felix Kling
@dustmouse 如答案所示,map现在是原生JavaScript中一个相当普遍的函数,无需使用库。链接页面还提供了一个用于不支持它的浏览器的polyfill。 - James Thorpe
@James Thorpe。一些旧的浏览器,如IE 8及以下版本不支持本地数组映射功能。为什么不使用一个文档良好且相对标准的库,如underscore.js,它可以处理浏览器兼容性/实现细节,并提供大量其他功能呢? - lintmouse
@dustmouse 这就是 polyfill 的作用。它为缺乏实现的浏览器填充实现。 - Vivin Paliath
好的,所以你可以将polyfill添加到你的脚本中,或者你可以使用一个已经处理它以及一堆额外功能的库。 - lintmouse
4个回答

8

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版本更加优雅和惯用。


4
请理解作者不仅提供了解决方案,还解释了区别。+1 - Piotr Dajlido
foreach 的第三个参数是数组本身,因此您可以使用它而不是从外部引用它。 - Salman A

1
使用 map 替换 forEach
var arr = array.map(function(item) {return item * 0.8;})

map 方法会对数组中的每个元素调用一个提供的函数,并返回一个新的数组,而 forEach 不会创建新的数组。


我同意这一点,而且使用以下array.map(item => item * 0.8)会更好。 - harukaeru

1
这是使用 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


0

你可以使用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); 
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接