我正在尝试获取包含字符串,数字和字符串数字的数组的平均值。平均值必须考虑字符串化的数字。
我使用reduce可以得到目前为止的平均值,但是却无法忽略这些单词。 这就是我目前所拥有的。
<script>
function average() {
const array = [4, 45, 'hgd', '50', 87, 8, 'dhgs', 85, 4, '9'];
let sum = arr.reduce((x, y) =>
typeof +x === 'Number' ? x + y : +x + y);
sum = sum / arr.length;
return document.write(sum);
}
</script>
有人可以帮我吗?谢谢。
答案 0 :(得分:1)
尝试一下:
a.reduce((x, y) => +y ? x + +y : x)
对于平均值,您需要获取阵列的总大小,您可以在reduce
函数中做到这一点:
let count = 0;
a.reduce((x, y) => {
if (+y) {
count ++;
x += +y;
}
return x;
}, 0);
reduce
的第二个输入是developer on mozilla所说的初始值,在这种情况下我们需要为0,因此所有数组成员都进入y
(如果未提供,则第一个元素将被忽略),而count
给出的结果为真
更新1 如果只需要字符串编号,则必须使用以下字符串:
let sum = a.reduce((x, y) => typeof y !== 'number' && +y ? x + +y : x, 0)
平均而言,您需要此:
let count = 0;
let sum = a.reduce((x, y) => {
if (typeof y !== 'number' && +y) {
x + +y;
count ++;
}
return x;
}, 0);
let average = sum / count;
这完全符合您的预期。
答案 1 :(得分:1)
您可以过滤数字并将其映射为数字,同时也要遵守零值,然后将所有值相加并除以数字计数的长度。
const
not = f => (...a) => !f(...a),
add = (a, b) => a + b,
array = [4, 45, 'hgd', '50', 87, 8, 'dhgs', 85, 4, '9', '1a'],
temp = array.filter(not(isNaN)).map(Number),
avg = temp.reduce(add) / temp.length;
console.log(avg);
答案 2 :(得分:0)
假设您只希望将实际数值的平均值过滤掉非数字字符串并减少其他数字
const arr = [4, 45, 'hgd', '50', 87, 8, 'dhgs', 85, 4, '9'];
const nums = arr.filter(n => !isNaN(n)).map(Number)
const ave = nums.reduce((x, y) => x + y) / (nums.length || 1);
console.log(ave)