React Native评分App:从JS对象取值计算平均值并生成新对象
解决React Native中同结构对象的value平均值计算问题
嘿,我刚好处理过类似的需求,给你两个实用方案,分别对应你当前的场景和可能扩展的情况:
方案一:针对所有对象name相同的场景
如果你的数组里所有对象的name都是一致的(比如示例里的foo),可以用这个简单直接的函数:
function calculateAverageObject(arr) { // 先做边界检查,避免空数组或undefined导致报错 if (!arr || arr.length === 0) { return { name: '', value: 0 }; // 这里可以换成你需要的默认值,比如null } // 提取所有对象的value值,生成纯数值数组 const values = arr.map(item => item.value); // 计算value总和 const total = values.reduce((accumulator, currentValue) => accumulator + currentValue, 0); // 计算平均值 const averageValue = total / values.length; // 生成包含平均值的新对象 return { name: arr[0].name, // 取第一个对象的name,因为所有name都相同 value: averageValue }; } // 测试示例 var arr = [ {"name":"foo","value":2}, {"name":"foo","value":4} ]; const averageObj = calculateAverageObject(arr); console.log(averageObj); // 输出: { name: 'foo', value: 3 }
步骤拆解:
- 边界检查:提前拦截空数组或无效输入,避免后续代码报错
- 提取value:用
map快速把对象数组转换成纯数值数组,方便计算 - 计算总和:用
reduce累加所有value值,初始值设为0确保逻辑安全 - 生成新对象:复用原对象的name,把平均值作为新的value
方案二:支持多name分组计算平均值
如果之后你的需求扩展,数组里会出现不同name的对象,这个分组计算的方案会更实用:
function calculateAverageByGroupName(arr) { if (!arr || arr.length === 0) { return []; } // 第一步:按name分组,把相同name的value放在一起 const groupedData = arr.reduce((accumulator, item) => { if (!accumulator[item.name]) { accumulator[item.name] = []; } accumulator[item.name].push(item.value); return accumulator; }, {}); // 第二步:遍历分组数据,计算每个name的平均值并生成新对象 return Object.entries(groupedData).map(([name, values]) => { const total = values.reduce((acc, curr) => acc + curr, 0); const average = total / values.length; return { name, value: average }; }); } // 测试示例 var arr = [ {"name":"foo","value":2}, {"name":"foo","value":4}, {"name":"bar","value":5}, {"name":"bar","value":7} ]; const resultArray = calculateAverageByGroupName(arr); console.log(resultArray); // 输出: [ { name: 'foo', value: 3 }, { name: 'bar', value: 6 } ]
优势:
- 自动按name分组,一次处理多个不同name的对象集合
- 返回的是包含所有分组平均值对象的数组,扩展性更强
内容的提问来源于stack exchange,提问作者McKHAANNN
相关产品推荐
相关产品推荐

