Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从对象数组中的数据计算平均值,并存储在对象的特定键中_Javascript_Node.js - Fatal编程技术网

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

Javascript 从对象数组中的数据计算平均值,并存储在对象的特定键中,javascript,node.js,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}] 我想计算每个名称的平均值,以便预期

假设我有一个对象数组

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
这给了我所有对象的平均值

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

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

Tyy this

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])

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

const
books=[{name:'alpha',readingTime:1231},{name:'alpha',readingTime:1254},{name:'beta',readingTime:190},{name:'theta',readingTime:909},{name:'theta',readingTime:10}],
平均值=Object.fromEntries(
Object.entries(books.reduce((r,{name,readingTime})=>{
r[name]=r[name]|{计数:0,总计:0};
r[name].count++;
r[name].total+=readingTime;
返回r;
}, {}))
.map(([k,{count,total}])=>[k,total/count])
);

控制台日志(平均值)这里是另一个简单的解决方案

constbook=[{'name':'alpha','readingTime':1231},{'name':'alpha','readingTime':1254},
{'name':'beta','readingTime':190},
{'name':'theta','readingTime':909},
{'name':'theta','readingTime':10}]
const result={};
对象值(账面减少值)(会计科目,当前)=>{
acc[current.name]=acc[current.name]|{计数:0,总数:0};
acc[current.name].total+=current.readingTime;
acc[当前名称].计数+=1;
acc[current.name].name=current.name;
返回acc;
}forEach(({name,count,total})=>{result[name]=total/count;});
console.log(result)
需要更多优化(可以自由编辑),但它可以工作

constbook=[{'name':'alpha','readingTime':1231},{'name':'alpha','readingTime':1254},
{'name':'beta','readingTime':190},
{'name':'theta','readingTime':909},{'name':'theta','readingTime':10}]
函数avgReading(arr){
设alpha={lengtharr:0,readingAll:0};
设beta={…alpha};
设θ={…α};
arr.forEach((项目)=>{
如果(item.name=='alpha')
alpha.lengtharr++;
alpha.readingAll=alpha.readingAll+item.readingTime;
如果(item.name=='beta')
beta.lengtharr++;
beta.readingAll=beta.readingAll+item.readingTime;
如果(item.name=='theta')
θ.lengtharr++;
theta.readingAll=theta.readingAll+item.readingTime;
});
常量对象={
“alpha”:alpha.readingAll/alpha.lengtharr,
“beta”:beta.readingAll/beta.lengtharr,
“theta”:theta.readingAll/theta.lengtharr
}
返回obj;
}

console.log(avgreding(book))
一个开关盒,总是有相同的代码,只是不同的键。。。你可以用一个开关盒对所有东西进行编程,但它是不可维护的。在vscode中使用时,双问号给了我意外的标记。对于这个问题,有什么替代方案呢?采取逻辑或相反的方法。请参见编辑。