如何在JavaScript中计算对象数组中给定属性的平均值

kgsdhlau  于 2023-01-04  发布在  Java
关注(0)|答案(5)|浏览(277)

我试图从变量avengers中得到属性“markAv”的平均值。

avengers = []

function Avenger(fullName, classRoom, city, job, studies, markAv) {
    this.fullName =  fullName;
    this.classRoom = classRoom;
    this.city = city;
    this.job = job;
    this.studies = studies;
    this.markAv = markAv;
    avengers.push(arguments)
}

Avenger({
    fullName: "Hulk Paul", 
    classRoom: "V", 
    city: "Miami", 
    job: "Cientist", 
    studies: "Harvard", 
    markAv: 8
})

Avenger({
    fullName: "Tony Stark", 
    classRoom: "XI", 
    city: "NYC", 
    job: "Ingeneer", 
    studies: "MIT", 
    markAv: 10
})

Avenger({
    fullName: "Diana Princess", 
    classRoom: "III", 
    city: "NYC", 
    job: "Warrior", 
    studies: "Atenas", 
    markAv: 11
})

Avenger({
    fullName: "Thais Jacob", 
    classRoom: "IV", 
    city: "Málaga", 
    job: "IT", 
    studies: "Brazil", 
    markAv: 5
})

为了得到它,我插入了函数“getAverage”。但是,它返回“NaN”。我想知道原因和如何解决它的解释,因为我不明白为什么。

let getAverage = arr => {
    let reducer = (total, currentValue) => total + currentValue;
    let sum = arr.reduce(reducer)
    return sum / arr.length;
}
  
let average = avengers.map(markAv => avengers.markAv);
  
console.log(getAverage(average));
4nkexdtk

4nkexdtk1#

您的代码中有几个问题:

1.您将创建传递给Avenger函数的参数数组,而不是为每个对象创建Avenger函数构造函数的示例。
1.您正在向Avenger函数传递一个对象,而不是单个参数。
1.您正在尝试访问avengers数组的markAv属性,而不是正在Map的当前对象。

要解决这些问题,您可以执行以下操作

1.使用new关键字并传递所需参数,为每个对象创建Avenger函数的示例。
1.将各个参数传递给Avenger函数,而不是对象。
1.使用Map到的当前对象(本例中为obj)访问其属性,而不是avengers数组。
下面是更新后的工作代码:

let avengers = [];

function Avenger(fullName, classRoom, city, job, studies, markAv) {
    this.fullName =  fullName;
    this.classRoom = classRoom;
    this.city = city;
    this.job = job;
    this.studies = studies;
    this.markAv = markAv;
}

avengers.push(new Avenger("Hulk Paul", "V", "Miami", "Cientist", "Harvard", 8));
avengers.push(new Avenger("Tony Stark", "XI", "NYC", "Ingeneer", "MIT", 10));
avengers.push(new Avenger("Diana Princess", "III", "NYC", "Warrior", "Atenas", 11));
avengers.push(new Avenger("Thais Jacob", "IV", "Málaga", "IT", "Brazil", 5));

let getAverage = arr => {
    let reducer = (total, currentValue) => total + currentValue;
    let sum = arr.reduce(reducer)
    return sum / arr.length;
}
  
let average = avengers.map(obj => obj.markAv);
  
console.log(getAverage(average));
zy1mlcev

zy1mlcev2#

更改let average = avengers.map(markAv => markAv.markAv);,同时请替换avengers.push(arguments[0])

avengers = []

function Avenger(fullName, classRoom, city, job, studies, markAv) {
  this.fullName = fullName;
  this.classRoom = classRoom;
  this.city = city;
  this.job = job;
  this.studies = studies;
  this.markAv = markAv;
  avengers.push(arguments[0]); // here changed
}

Avenger({
  fullName: "Hulk Paul",
  classRoom: "V",
  city: "Miami",
  job: "Cientist",
  studies: "Harvard",
  markAv: 8
})

Avenger({
  fullName: "Tony Stark",
  classRoom: "XI",
  city: "NYC",
  job: "Ingeneer",
  studies: "MIT",
  markAv: 10
})

Avenger({
  fullName: "Diana Princess",
  classRoom: "III",
  city: "NYC",
  job: "Warrior",
  studies: "Atenas",
  markAv: 11
})

Avenger({
  fullName: "Thais Jacob",
  classRoom: "IV",
  city: "Málaga",
  job: "IT",
  studies: "Brazil",
  markAv: 5
})

let getAverage = arr => {
  let reducer = (total, currentValue) => total + currentValue;
  let sum = arr.reduce(reducer)
  return sum / arr.length;
}

let average = avengers.map(item => item.markAv); // here changed

console.log(getAverage(average));
i5desfxk

i5desfxk3#

看起来您正在尝试使用function constructor,因此您应该使用new关键字,并将这些新对象示例添加到数组中。
然后在reducer中将所有markAv值相加,然后除以数组的长度。

const avengers = [];

// Since you're passing in an object
// you can simply iterate over it and apply
// each prop value to `this` instead.
function Avenger(obj) {
  for (const prop in obj) {
    this[prop] = obj[prop];
  }
}

avengers.push(new Avenger({
  fullName: "Hulk Paul", 
  classRoom: "V", 
  city: "Miami", 
  job: "Cientist", 
  studies: "Harvard", 
  markAv: 8
}));

avengers.push(new Avenger({
  fullName: "Tony Stark", 
  classRoom: "XI", 
  city: "NYC", 
  job: "Ingeneer", 
  studies: "MIT", 
  markAv: 10
}));

avengers.push(new Avenger({
  fullName: "Diana Princess", 
  classRoom: "III", 
  city: "NYC", 
  job: "Warrior", 
  studies: "Atenas", 
  markAv: 11
}));

avengers.push(new Avenger({
  fullName: "Thais Jacob", 
  classRoom: "IV", 
  city: "Málaga", 
  job: "IT", 
  studies: "Brazil", 
  markAv: 5
}));

function getAverage(arr) {
  return arr.reduce((acc, c) => {
    return acc + c.markAv;
  }, 0) / arr.length;
}

console.log(getAverage(avengers));
js4nwp54

js4nwp544#

let avengers = []

function Avenger(fullName, classRoom, city, job, studies, markAv) {
    this.fullName =  fullName;
    this.classRoom = classRoom;
    this.city = city;
    this.job = job;
    this.studies = studies;
    this.markAv = markAv;
}

avengers.push(new Avenger("Hulk Paul", "V", "Miami", "Cientist", "Harvard", 8));
avengers.push(new Avenger("Tony Stark", "XI", "NYC", "Ingeneer", "MIT", 10));
avengers.push(new Avenger("Diana Princess", "III", "NYC", "Warrior", "Atenas", 11));
avengers.push(new Avenger("Thais Jacob", "IV", "Málaga", "IT", "Brazil", 5));

let Avg=avengers.reduce((cur,acc)=>cur+acc.markAv,0)
console.log(Avg/avengers.length)
oipij1gg

oipij1gg5#

const markSum = Avengers.reduce((sum, Avenger) => sum + Avenger.markAv, 0);
const markAvg = markSum / Avengers.length;

console.log(markAvg);

相关问题