Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.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_Arrays_Object - Fatal编程技术网

Javascript 如何使用相同的键对对象值求和并返回一个对象?

Javascript 如何使用相同的键对对象值求和并返回一个对象?,javascript,arrays,object,Javascript,Arrays,Object,我试图根据阵列中每个对象中可用的选定关键帧对对象值求和。我的问题是如何处理百分比。在下面的代码示例中,满意度应为48 我的输出应该是: { "学生":87,, "书":32本,, “满意度”:48 } const myData=[ { "学生":30,, "书":10本,, “满意度”:60%, ‘返校学生’:14 }, { "学生":25,, "书":8本,, “满意度”:45%, ‘返校学生’:14 }, { "学生":32,, "书":14本,, “满意度”:39%, ‘返校学生’:19

我试图根据阵列中每个对象中可用的选定关键帧对对象值求和。我的问题是如何处理
百分比
。在下面的代码示例中,
满意度
应为
48

我的输出应该是:

{
"学生":87,,
"书":32本,,
“满意度”:48
}

const myData=[
{
"学生":30,,
"书":10本,,
“满意度”:60%,
‘返校学生’:14
}, {
"学生":25,,
"书":8本,,
“满意度”:45%,
‘返校学生’:14
}, {
"学生":32,,
"书":14本,,
“满意度”:39%,
‘返校学生’:19
}
];
const keystemissue=[“学生”、“书籍”、“满意度”];
函数getSumOrAvgValuesOfKeys(数据){
常量obj={};
设val=0;
keystoink.forEach(el=>{
data.forEach(元素=>{
if(typeof(元素[el]='string')){
val+=parseInt(元素[el],10);
}否则{
val+=元素[el];
}
});
obj[el]=val;
//重置值
val=0;
});
返回obj;
}

log(getSumOrAvgValuesOfKeys(myData))您可能有另一个数组,其中包含要求平均值的键,在准备求和结果后,您可以仅计算这些键的平均值

const myData=[{
"学生":30,,
"书":10本,,
“满意度”:60%,
‘返校学生’:14
}, {
"学生":25,,
"书":8本,,
“满意度”:45%,
‘返校学生’:14
}, {
"学生":32,,
"书":14本,,
“满意度”:39%,
‘返校学生’:19
}];
const keystemissue=[“学生”、“书籍”、“满意度”];
让keysWithPercent=[“满意度”];
const summated=myData.reduce((结果,项目)=>{
keystoink.forEach(k=>{
如果(!结果[k]){
结果[k]=0;
}
设v=parseInt(项目[k],10);
结果[k]+=v;
});
返回结果;
}, {});
keysWithPercent.forEach(k=>{
summated[k]=summated[k]/myData.length;
})

console.log(总和)
您可以使用
reduce
方法,然后在最后一次迭代中计算值为字符串类型的每个元素的平均值

const myData=[{“学生”:30,“书籍”:10,“满意度”:“60%”,“返校生”:14},{“学生”:25,“书籍”:8,“满意度”:“45%”,“返校生”:14},{“学生”:32,“书籍”:14,“满意度”:“39%”,“返校生”:19}]
const key=[“学生”、“书籍”、“满意度”];
const result=myData.reduce((r,e,i,a)=>{
forEach(k=>r[k]=(r[k]| | 0)+parseInt(e[k]);
如果(!a[i+1])对象。键(e)
.filter(k=>typeof e[k]=='string')
.forEach(k=>r[k]/=myData.length)
返回r;
}, {})

console.log(result)
您可以通过获取以前的值或默认值来减少对象。对于百分比值,取三分之一进行求和

var数据=[{学生:30人,书籍:10人,满意度:“60%”,返校生:14人,{学生:25人,书籍:8人,满意度:“45%”,返校生:14人,{学生:32人,书籍:14人,满意度:“39%”,返校生:19人],
结果=数据.reduce((r,{学生,书籍,满意度},{u,a)=>({
学生:(学生| | 0)+学生,
书籍:(r.books | | 0)+书籍,
满意率:(r.满意率| | 0)+满意率.切片(0,-1)/a.长度
}), {});

控制台日志(结果)
IMHO,您可以使用
reduce
这样做:

var myData=[{学生:30,书籍:10,满意率:“60%”,返校学生:14},{学生:25,书籍:8,满意率:“45%”,返校学生:14},{学生:32,书籍:14,满意率:“39%”,返校学生:19}]
var result=myData.reduce((累计,{学生,书籍,满意度_rate},idx,arr)=>{
accum[“学生”]?(accum[“学生”]+=学生):(accum[“学生”]=学生);
accum[“books”]?(accum[“books”]+=图书):(accum[“books”]=图书);
累计[“满意率”]?(累计[“满意率”]+=parseInt(满意率)):(累计[“满意率”]=parseInt(满意率));
if(idx==arr.length-1){
累计[“满意率”]=累计[“满意率”]/arr.length
}
返回累计;
}, {});

控制台日志(结果)
更通用的解决方案是指定如何减少
对象中的每个键。您可以使用SUM、AVG、MIN、MAX和更复杂的值(如标准偏差)来减少它们

在这种情况下,我会将您的
密钥更改为对象而不是数组:

const myData=[{
"学生":30,,
"书":10本,,
“满意度”:60%,
‘返校学生’:14
}, {
"学生":25,,
"书":8本,,
“满意度”:45%,
‘返校学生’:14
}, {
"学生":32,,
"书":14本,,
“满意度”:39%,
‘返校学生’:19
}];
密钥考虑={
"学生":总结,,
"书":总和,,
“满意度”:平均
}
功能还原键的值(数据){
常量obj={};
设val=0;
for(考虑中的var p){
var-reduce=p;
obj[p]=reduce(数据,p);
}
返回obj;
}
函数和(数据、属性){
var=0;
data.forEach(元素=>{
if(typeof(元素[属性]='string')){
val+=parseInt(元素[属性],10);
}否则{
val+=元素[属性];
}
});
返回val;
}
函数平均值(数据、属性){
var=0;
data.forEach(元素=>{
if(typeof(元素[属性]='string')){
val+=parseInt(元素[属性],10