从对象数组中的数据计算平均值并存储在对象的特定键中

时间:2021-04-21 07:26:22

标签: javascript node.js

假设我有一个对象数组,

const book = [{'name':'alpha','readingTime':1231},{'name':'alpha','readingTime':1254}, 
              {'name':'beta','readingTime':190},
              {'name':'theta','readingTime':909},{'name':'theta','readingTime':10}]

我想计算每个名字的平均值,这样预期的 O/P 是

**{alpha:1242.5, beta:190, theta:459.5}**

为此,我尝试过,

let calculatedValue = book.reduce((acc,curr) => acc+curr.readingTime,0)/book.length

这给了我所有对象的平均值。

我无法形成与之对应的逻辑。

任何指导都会很有帮助。如果有人需要任何进一步的信息,请告诉我。

4 个答案:

答案 0 :(得分:1)

您可以按 name 分组并获取 readingTime 的计数和总数,然后使用平均值构建一个新对象。

const
    books = [{ name: 'alpha', readingTime: 1231 }, {  name: 'alpha', readingTime: 1254 }, { name: 'beta', readingTime: 190 }, { name: 'theta', readingTime: 909 }, { name: 'theta', readingTime: 10 }],
    averages = Object.fromEntries(
        Object.entries(books.reduce((r, { name, readingTime }) => {
            r[name] = r[name] || { count: 0, total: 0 };
            r[name].count++;
            r[name].total += readingTime;
            return r;
        }, {}))
        .map(([k, { count, total }]) => [k, total / count])
    );

console.log(averages);

答案 1 :(得分:1)

这里有另一个简单的解决方案。

const book = [{'name':'alpha','readingTime':1231},{'name':'alpha','readingTime':1254}, 
{'name':'beta','readingTime':190},
{'name':'theta','readingTime':909},
{'name':'theta','readingTime':10}]

const result = {};

Object.values(book.reduce((acc, current) => {
    acc[current.name] = acc[current.name] || { count: 0, total: 0 };
    acc[current.name].total += current.readingTime;
    acc[current.name].count += 1;
    acc[current.name].name = current.name;

    return acc;
}, {})).forEach(({ name, count, total }) => { result[name] = total / count; });

console.log(result)

答案 2 :(得分:1)

需要更多优化(随意编辑)但它有效

const book = [{'name':'alpha','readingTime':1231},{'name':'alpha','readingTime':1254}, 
              {'name':'beta','readingTime':190},
              {'name':'theta','readingTime':909},{'name':'theta','readingTime':10}]


function avgReading(arr){
let alpha = { lengtharr : 0 ,readingAll : 0 };
let beta = {...alpha};
let theta = {...alpha};
arr.forEach((item) => {
  if(item.name === 'alpha') 
    alpha.lengtharr++;
    alpha.readingAll = alpha.readingAll + item.readingTime;
  if(item.name === 'beta') 
    beta.lengtharr++;
    beta.readingAll = beta.readingAll + item.readingTime;
 if(item.name === 'theta')
    theta.lengtharr++;
    theta.readingAll = theta.readingAll + item.readingTime;
});
const obj = {
'alpha' : alpha.readingAll /alpha.lengtharr,
'beta' : beta.readingAll /beta.lengtharr,
'theta' : theta.readingAll /theta.lengtharr
}
return obj;
}
console.log(avgReading(book))

答案 3 :(得分:0)

你喜欢这个

let obj = book.reduce((acc,curr) => {
    acc[curr['name']] = acc[curr['name']]?acc[curr['name']]:[0,0]
    acc[curr['name']][0]+=curr['readingTime'];
    acc[curr['name']][1]+=1;
    return acc;
}, {})

let calculatedValue ={};
Object.keys(obj).forEach(key=>calculatedValue[key]=obj[key][0]/obj[key][1])