我有一系列数字:
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;});
,但结果未定义。
答案 0 :(得分:6)
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 :(得分:1)
使用map
代替forEach
:
var arr = array.map(function(item) {return item * 0.8;})
map方法创建一个新数组,其中包含调用a的结果
1>}在此数组中的每个元素上提供了函数,forEach
不会创建新数组。
答案 2 :(得分:0)
以下是使用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
可以就地修改数组:
答案 3 :(得分:0)
您可以直接使用map
,但要使用forEach
,请注意:
.forEach(function() { <code> })
等同于(...) { <code> }.
。 您正在将数字相乘,但对这些数字不做任何操作。您可以更改正在使用的实际数组,但应将该操作分配给该数组。 (我还添加了.toFixed(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);
});