Javascript 如何计算获取请求中数据的平均值?

Javascript 如何计算获取请求中数据的平均值?,javascript,function,fetch,es6-promise,Javascript,Function,Fetch,Es6 Promise,因此,我有一个表,其中填充了来自API的数据。现在我想添加一个带有数据中平均质量键的标记。下面是我必须获取表数据的代码,它非常有效: 常量url=“” 下面是我必须得到平均值的代码,这不起作用: const link = 'https://swapi.co/api/species/1/'; function fetchLink(link) { return fetch(link).then((resp) => resp.json()); } fetchLink(link).t

因此,我有一个表,其中填充了来自API的数据。现在我想添加一个带有数据中平均质量键的
标记。下面是我必须获取表数据的代码,它非常有效: 常量url=“”

下面是我必须得到平均值的代码,这不起作用:

const link = 'https://swapi.co/api/species/1/';
 function fetchLink(link) {
   return fetch(link).then((resp) => resp.json());
 }

 fetchLink(link).then(data =>
    data.people.forEach(personUrl =>
    fetchData(personUrl).then(result => {
      const getMass = result.mass;
         return getMass.reduce(function(a, b) {
            return a + b;
        }) / getMass.length;
    })
  )

);
运行此代码时,出现以下错误:

未捕获(承诺中)TypeError:getMass.reduce不是fetchData.then.result的函数

我是否可以通过某种方式将其更改为在该提取内部运行,或者我是否必须有一个单独的函数?

url“”返回以下内容,但没有mass属性

{
"name": "Human", 
"classification": "mammal", 
"designation": "sentient", 
"average_height": "180", 
"skin_colors": "caucasian, black, asian, hispanic", 
"hair_colors": "blonde, brown, black, red", 
"eye_colors": "brown, blue, green, hazel, grey, amber", 
"average_lifespan": "120", 
"homeworld": "https://swapi.co/api/planets/9/", 
"language": "Galactic Basic", 
"people": [
    "https://swapi.co/api/people/1/", 
    "https://swapi.co/api/people/4/", 
    "https://swapi.co/api/people/5/", 
    "https://swapi.co/api/people/6/", 
    "https://swapi.co/api/people/7/", 
    "https://swapi.co/api/people/9/", 
    "https://swapi.co/api/people/10/", 
    "https://swapi.co/api/people/11/", 
    "https://swapi.co/api/people/12/", 
    "https://swapi.co/api/people/14/", 
    "https://swapi.co/api/people/18/", 
    "https://swapi.co/api/people/19/", 
    "https://swapi.co/api/people/21/", 
    "https://swapi.co/api/people/22/", 
    "https://swapi.co/api/people/25/", 
    "https://swapi.co/api/people/26/", 
    "https://swapi.co/api/people/28/", 
    "https://swapi.co/api/people/29/", 
    "https://swapi.co/api/people/32/", 
    "https://swapi.co/api/people/34/", 
    "https://swapi.co/api/people/43/", 
    "https://swapi.co/api/people/51/", 
    "https://swapi.co/api/people/60/", 
    "https://swapi.co/api/people/61/", 
    "https://swapi.co/api/people/62/", 
    "https://swapi.co/api/people/66/", 
    "https://swapi.co/api/people/67/", 
    "https://swapi.co/api/people/68/", 
    "https://swapi.co/api/people/69/", 
    "https://swapi.co/api/people/74/", 
    "https://swapi.co/api/people/81/", 
    "https://swapi.co/api/people/84/", 
    "https://swapi.co/api/people/85/", 
    "https://swapi.co/api/people/86/", 
    "https://swapi.co/api/people/35/"
], 
"films": [
    "https://swapi.co/api/films/2/", 
    "https://swapi.co/api/films/7/", 
    "https://swapi.co/api/films/5/", 
    "https://swapi.co/api/films/4/", 
    "https://swapi.co/api/films/6/", 
    "https://swapi.co/api/films/3/", 
    "https://swapi.co/api/films/1/"
], 
"created": "2014-12-10T13:52:11.567000Z", 
"edited": "2015-04-17T06:59:55.850671Z", 
"url": "https://swapi.co/api/species/1/"   }   
url“”确实具有mass属性,但不是数组,因此.reduce和.filter都不起作用,因为它们只是数组对象上存在的方法。

url“”返回以下内容,但没有mass属性

{
"name": "Human", 
"classification": "mammal", 
"designation": "sentient", 
"average_height": "180", 
"skin_colors": "caucasian, black, asian, hispanic", 
"hair_colors": "blonde, brown, black, red", 
"eye_colors": "brown, blue, green, hazel, grey, amber", 
"average_lifespan": "120", 
"homeworld": "https://swapi.co/api/planets/9/", 
"language": "Galactic Basic", 
"people": [
    "https://swapi.co/api/people/1/", 
    "https://swapi.co/api/people/4/", 
    "https://swapi.co/api/people/5/", 
    "https://swapi.co/api/people/6/", 
    "https://swapi.co/api/people/7/", 
    "https://swapi.co/api/people/9/", 
    "https://swapi.co/api/people/10/", 
    "https://swapi.co/api/people/11/", 
    "https://swapi.co/api/people/12/", 
    "https://swapi.co/api/people/14/", 
    "https://swapi.co/api/people/18/", 
    "https://swapi.co/api/people/19/", 
    "https://swapi.co/api/people/21/", 
    "https://swapi.co/api/people/22/", 
    "https://swapi.co/api/people/25/", 
    "https://swapi.co/api/people/26/", 
    "https://swapi.co/api/people/28/", 
    "https://swapi.co/api/people/29/", 
    "https://swapi.co/api/people/32/", 
    "https://swapi.co/api/people/34/", 
    "https://swapi.co/api/people/43/", 
    "https://swapi.co/api/people/51/", 
    "https://swapi.co/api/people/60/", 
    "https://swapi.co/api/people/61/", 
    "https://swapi.co/api/people/62/", 
    "https://swapi.co/api/people/66/", 
    "https://swapi.co/api/people/67/", 
    "https://swapi.co/api/people/68/", 
    "https://swapi.co/api/people/69/", 
    "https://swapi.co/api/people/74/", 
    "https://swapi.co/api/people/81/", 
    "https://swapi.co/api/people/84/", 
    "https://swapi.co/api/people/85/", 
    "https://swapi.co/api/people/86/", 
    "https://swapi.co/api/people/35/"
], 
"films": [
    "https://swapi.co/api/films/2/", 
    "https://swapi.co/api/films/7/", 
    "https://swapi.co/api/films/5/", 
    "https://swapi.co/api/films/4/", 
    "https://swapi.co/api/films/6/", 
    "https://swapi.co/api/films/3/", 
    "https://swapi.co/api/films/1/"
], 
"created": "2014-12-10T13:52:11.567000Z", 
"edited": "2015-04-17T06:59:55.850671Z", 
"url": "https://swapi.co/api/species/1/"   }   

url“”确实具有mass属性,但不是数组,因此.reduce和.filter都不起作用,因为它们是数组对象上唯一存在的方法。

代码中几乎没有未处理的问题

首先,你试图在每个人的体重上调用
。reduce
,这没有什么意义:

const getMass = result.mass;
return getMass.reduce(function(a, b) {
  return a + b;
}) / getMass.length;
这就是
getMass.reduce不是函数的原因
错误来自–
。reduce
方法处理数组,并且
result.mass
是,例如
“77”
,因此上面没有
。reduce

其次,人的质量不是一个数字,它实际上是一个字符串(
“77”
,而不是
77
),所以即使是这些质量的数组(
[“87”,“77”…])也不能得到总质量和平均质量:

["87", "77"].reduce((a, sum) => a + sum) // -> "8777"
您必须首先将这些值转换为实际值:

["87", "77"].map(a => parseInt(a)) // -> [87, 77]
[87, 77].reduce((a, sum) => a + sum) // -> 164
如果需要十进制质量(如
“77.25”
),请使用
parseFloat
而不是
parseInt

此外,其中一些字符串甚至不是数字,而是
“未知”
。所以你必须过滤掉它们:

["87", "77", "unknown"].filter(mass => !isNaN(mass)) // -> ["87", "77"]
我将这样做,希望这些评论能帮助您了解细节:

const getAvgMass=async url=>
获取(url)
.then(r=>r.json())
.那么(
异步数据=>
(wait Promise.all(//获取并处理所有人员后返回数组)
data.people.map(personUrl=>//获取每个人的URL,
fetch(personUrl)//从中获取数据,
.then(r=>r.json())
//并用person的mass替换数组中的URL
//(parseInt解析数字字符串,如“77”到77(整数),
//和非数字字符串,如NaN的“未知”:
.然后(person=>parseInt(person.mass))/=>
)
//过滤掉这些NAN:
)).过滤器(质量=>!isNaN(质量))/->[77,136,49,120,75,84,77,84,80,77,]
)
//对所有质量求和并除以(过滤后的)数组长度:
.然后(质量=>质量.减少((和,x)=>和+x)/质量.长度);//->82.77272…
//顶级等待还没有(还没有?https://github.com/MylesBorins/proposal-top-level-await)支持
//在浏览器中(除了最新版本的Chrome控制台),因此要记录结果,我们必须执行以下操作:
//getAvgMass(“https://swapi.co/api/species/1/),然后(result=>console.log(result));//日志82.77272…
//或:
//const logResult=async()=>console.log(等待getAvgMass(“https://swapi.co/api/species/1/"));
//logResult();//日志82.77272…
//甚至:
//(异步()=>{
//console.log(等待getAvgMass(“https://swapi.co/api/species/1/)//日志82.77272…
// })();
//要在DOM元素中使用,只需替换console.log:
(异步()=>{
const avgMass=等待获取avgMass(“https://swapi.co/api/species/1/");
console.log(avgMass);//日志82.77272…
document.getElementById(“sw mass”).innerText=avgMass.toFixed(2);//将文本设置为82.77
})();

平均质量:…

代码中几乎没有未处理的问题

首先,你试图在每个人的体重上调用
。reduce
,这没有什么意义:

const getMass = result.mass;
return getMass.reduce(function(a, b) {
  return a + b;
}) / getMass.length;
这就是
getMass.reduce不是函数的原因
错误来自–
。reduce
方法处理数组,并且
result.mass
是,例如
“77”
,因此上面没有
。reduce

其次,人的质量不是一个数字,它实际上是一个字符串(
“77”
,而不是
77
),所以即使是这些质量的数组(
[“87”,“77”…])也不能得到总质量和平均质量:

["87", "77"].reduce((a, sum) => a + sum) // -> "8777"
您必须首先将这些值转换为实际值:

["87", "77"].map(a => parseInt(a)) // -> [87, 77]
[87, 77].reduce((a, sum) => a + sum) // -> 164
如果需要十进制质量(如
“77.25”
),请使用
parseFloat
而不是
parseInt

此外,其中一些字符串甚至不是数字,而是
“未知”
。所以你必须过滤掉它们:

["87", "77", "unknown"].filter(mass => !isNaN(mass)) // -> ["87", "77"]
我将这样做,希望这些评论能帮助您了解细节:

const getAvgMass=async url=>
获取(url)
.then(r=>r.json())
.那么(
异步数据=>
(wait Promise.all(//获取并处理所有人员后返回数组)
data.people.map(personUrl=>//获取每个人的URL,
fetch(personUrl)//从中获取数据,
.then(r=>r.json())
//并用person的mass替换数组中的URL
//(parseInt解析数字字符串,如“77”到77(整数),
//和非数字字符串,如NaN的“未知”:
.然后(person=>parseInt(person.mass))/=>
)
//过滤掉这些NAN:
)).过滤器(质量=>!isNaN(质量))/->[77,136,49,120,75,84,77,84,80,77,]
)
//对所有质量求和并除以(过滤后的)数组长度:
然后(质量=>mass.reduce((和,x)=>sum+x)/mass.le