假设我有一个对象数组,
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
这给了我所有对象的平均值。
我无法形成与之对应的逻辑。
任何指导都会很有帮助。如果有人需要任何进一步的信息,请告诉我。
答案 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])