问题描述
let array = [{length:0},{length:5},{length:10},{length:5}]
let sum = array.filter(x=>x.length).reduce((a,b)=>a.length + b.length,0)
let count = array.filter(x=>x.length).length
console.log(sum,count,sum/count)
我需要过滤> 0的值并基于这些值计算平均值,但是它总是获得sum
的NaN,因此得到我需要的平均值。我从这个answer here开始。
感谢您的任何建议。
解决方法
您的问题是如何使用reduce
函数。
let array = [
{ length: 0 },{ length: 5 },{ length: 10 },{ length: 5 }
];
let sum = array.filter((x) => x.length).reduce((a,b) => a + b.length,0);
let count = array.filter((x) => x.length).length;
console.log(sum,count,sum / count);
,
您需要存储过滤的项目并通过采用length
属性来获得总和。获取NaN
的原因是,您需要一个数字并从length
获得属性a
,但该属性不存在。在使用undefined
作为加法值时,您将获得NaN
作为总和。
稍后除以过滤后的数组的长度。
let array = [{ length: 0 },{ length: 5 }],items = array.filter(x => x.length),sum = items.reduce((sum,{ length }) => sum + length,0),length = items.length,average = sum / length;
console.log(sum,length,average);
一种通过将对象用于sum
和count
和单个循环的方法。
let array = [{ length: 0 },{ sum,count } = array.reduce(
(o,{ length }) => (o.sum += length,o.count += !!length,o),{ sum: 0,count: 0 }
),average = sum / count;
console.log(sum,average);
,
尝试一下:
const array = [{ length: 0 },{ length: 5 }];
let count = 0;
let sum = 0;
for (const item of array) {
if (item.length) {
sum += item.length;
count++;
}
}
console.log(sum / count);