Javascript 如何计算获取请求中数据的平均值?
因此,我有一个表,其中填充了来自API的数据。现在我想添加一个带有数据中平均质量键的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
标记。下面是我必须获取表数据的代码,它非常有效:
常量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