Javascript array.filter提供未定义的值

Javascript array.filter提供未定义的值,javascript,json,asynchronous,filter,fetch,Javascript,Json,Asynchronous,Filter,Fetch,我有一个json文件,其结构如下: {"year" : 1990, "fact": "Er waren oorspronkelijk maar drie seizoenen van de serie voorzien"} 在我的网站上,我有一部电影的片段。它们都有发布日期。如果发布日期与JSON文件中的特定年份匹配,我想显示一个属于该年份的事实。我尝试使用以下代码实现这一点: const showFact = async () => { const year = docu

我有一个json文件,其结构如下:

{"year" : 1990, "fact": "Er waren oorspronkelijk maar drie seizoenen van de serie voorzien"}
在我的网站上,我有一部电影的片段。它们都有发布日期。如果发布日期与JSON文件中的特定年份匹配,我想显示一个属于该年份的事实。我尝试使用以下代码实现这一点:

const showFact = async () => {
        const year = document.querySelector(`.date`).textContent.split(` `)[2];
        const response = await fetch(`./assets/data/nice-to-know.json`);
        const facts = response.json();
        const fact = facts.filter(fact => fact.year == year).fact;
        document.querySelector(`.fact`).textContent = fact;
      }

如果我
console.log(fact)
,我会看到事实是
未定义的
Array.prototype.filter
仍然返回一个数组,您要查找的是
Array.prototype.find

const事实=[
{“年份”:1990年,“事实”:“1990年事实”},
{“年份”:1991年,“事实”:“1991年事实”},
{“年份”:1992年,“事实”:“1992年事实”},
{“年份”:1993年,“事实”:“1993年事实”}
]
const fact=facts.find(fact=>fact.year==1990);

console.log(事实)
Array.prototype.filter
仍然返回一个数组,您要查找的是
Array.prototype.find

const事实=[
{“年份”:1990年,“事实”:“1990年事实”},
{“年份”:1991年,“事实”:“1991年事实”},
{“年份”:1992年,“事实”:“1992年事实”},
{“年份”:1993年,“事实”:“1993年事实”}
]
const fact=facts.find(fact=>fact.year==1990);
console.log(事实)
array.filter返回一个数组。我只需要选择该数组的第一项


array.filter返回一个数组。我只需要选择该数组的第一项

正如我在评论中所说,你的问题在于

const fact = facts.filter(fact => fact.year == year).fact;
因为
filter
返回一个数组,当然,它没有
fact
属性

假设
filter
返回一个非空的单元素数组,您的意思可能是

const fact = facts.filter(fact => fact.year == year)[0].fact;

正如我在评论中所说,你的问题在于

const fact = facts.filter(fact => fact.year == year).fact;
因为
filter
返回一个数组,当然,它没有
fact
属性

假设
filter
返回一个非空的单元素数组,您的意思可能是

const fact = facts.filter(fact => fact.year == year)[0].fact;
正如注释中指出的,您正在尝试访问数组上的属性。当你过滤
facts
它成为一个数组时,你需要映射它

const showFact=async()=>{
const year=document.querySelector(`.date`).textContent.split(`)[2];
const response=wait fetch(`./assets/data/nice to know.json`);
const facts=response.json();
const factList=facts.filter(fact=>fact.year==year.map(fact=>fact.fact);
document.querySelector(`.fact`)。textContent=factList.join(“
”); }
上面我使用
map
函数将事实提取到一个只包含事实的数组(不含年份),然后用换行符连接。

如注释所述,您正在尝试访问数组上的属性。当你过滤
facts
它成为一个数组时,你需要映射它

const showFact=async()=>{
const year=document.querySelector(`.date`).textContent.split(`)[2];
const response=wait fetch(`./assets/data/nice to know.json`);
const facts=response.json();
const factList=facts.filter(fact=>fact.year==year.map(fact=>fact.fact);
document.querySelector(`.fact`)。textContent=factList.join(“
”); }

上面我使用
map
函数将事实提取到一个只包含事实的数组中(不含年份),然后用换行符连接。

facts.filter(fact=>fact.year==year)。fact
那么您有一个带有
fact
属性的数组了吗?也许你的意思是
facts.filter(fact=>fact.year==year)[0]。fact
?filter仍然返回一个数组,你要查找的是
。find
@FedericoklezCulloca yes!请参阅JSON文件以了解结构。@Foxonfirhd我编辑了我的评论,也许现在已经清楚了。@FedericoklezCulloca是的,我错过了,现在它可以工作了
facts.filter(fact=>fact.year==year)。fact
那么您有一个带有
fact
属性的数组?也许你的意思是
facts.filter(fact=>fact.year==year)[0]。fact
?filter仍然返回一个数组,你要查找的是
。find
@FedericoklezCulloca yes!请参阅JSON文件以了解结构。@Foxonfirhd我编辑了我的评论,也许现在已经清楚了。@FedericoklezCulloca是的,我错过了,现在它可以工作了@这是正确的答案,应该被接受。@这是正确的答案,应该被接受。