Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.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 if语句';s条件元素>;数字给出了奇怪的结果_Javascript_Api_Fetch - Fatal编程技术网

Javascript if语句';s条件元素>;数字给出了奇怪的结果

Javascript if语句';s条件元素>;数字给出了奇怪的结果,javascript,api,fetch,Javascript,Api,Fetch,好的,标题很笼统,但我想我没有足够的语言来解释这个问题 因此,我从一个外部API获取一些数据,并希望过滤一些结果。我使用forEach循环响应,然后使用if语句根据一些条件排除其中的一些响应 因此,在本例中,我获取一些电影数据,并希望排除返回时没有img url的电影。这部分很好用。接下来我想排除受欢迎程度低的电影。json对象的受欢迎程度由一个数字设置,即4.45644 const findMovies = response.results; findMovies.forEach( mov

好的,标题很笼统,但我想我没有足够的语言来解释这个问题

因此,我从一个外部API获取一些数据,并希望过滤一些结果。我使用forEach循环响应,然后使用if语句根据一些条件排除其中的一些响应

因此,在本例中,我获取一些电影数据,并希望排除返回时没有img url的电影。这部分很好用。接下来我想排除受欢迎程度低的电影。json对象的受欢迎程度由一个数字设置,即4.45644

const findMovies = response.results;
  findMovies.forEach( movie => {
    if (movie.poster_path != null && movie.popularity > 8) {
       // print to DOM
    } else {
      //dont print nothing
    }
问题是,通过上面的代码,我过滤掉了所有受欢迎度小于或大于8的电影。我肯定我遗漏了一些非常愚蠢的东西,但到目前为止,我已经花了几个小时坚持了

如果您需要任何其他可能有用的代码片段,请告诉我

这基本上就是api响应在控制台上记录的内容

results: Array(20)
  0:
    adult:false
    poster_path: "/tjQHn6xW5BiB1RJ3OZIPDzIOSkF.jpg"
    popularity: 30.400022
    ....
试试这个

  const findMovies = response.results;
    findMovies.forEach( movie => {
      if (movie.poster_path != null && (8-movie.popularity> 0d)){
         // print to DOM
      } else {
         //dont print anything
      }
试试这个

  const findMovies = response.results;
    findMovies.forEach( movie => {
      if (movie.poster_path != null && (8-movie.popularity> 0d)){
         // print to DOM
      } else {
         //dont print anything
      }

下面是一些我们可以检查的代码。我想忘记您现有的代码,开始讨论问题的实质,即提取电影列表,分析它们,并以某种自定义方式对它们进行排序

我选择使用
Array.reduce()
,因为它允许我们跨过数据库中的每一部电影,并根据我们的感觉对其进行分析,然后创建一个输出对象,该对象过滤匹配结果并维护一个被拒绝电影的列表

我这样做是因为我想让你知道
reduce
是如何工作的(因为它太棒了)

//模拟电影数据库
康斯特电影=[
{标题:“萨米去商店”,海报路径:'http://www.com/photo.jpg“,人气:2,网址:”http://www.com' },
{标题:“萨米不去商店”,海报路径:'http://www.com/photo.jpg,流行度:4,url:'},
{标题:“威利去捕鲸艺术”,海报路径:'http://www.com/photo.jpg“,人气:6,网址:”http://www.com' },
{标题:“吉米只有一份工作”,海报路径:'http://www.com/photo.jpg,流行度:8,url:'},
{标题:“吉米不再有一份工作”,海报路径:'http://www.com/photo.jpg“,人气:10,网址:”http://www.com' },
{标题:“弗雷德去农场”,海报路径:未定义,人气:12,url:'http://www.com' },
{标题:“弗雷德不去农场”,海报路径:'http://www.com/photo.jpg,流行度:14,url:'},
{标题:'Helga去hackathon',海报路径:'http://www.com/photo.jpg“,人气:16,网址:”http://www.com' },
{标题:“比马只有一份工作”,海报路径:'http://www.com/photo.jpg,流行度:18,url:'},
{标题:'Bhima不再有一份工作',海报路径:空,人气:20,url:'http://www.com' },
]
//模拟网络请求以获取电影
const response={results:movies}
//从您现有的代码开始
const findMovies=response.results
//我们将使用Array.map()或Array.reduce()而不是forEach
//并将过滤结果设置为新数组,
//因为它提供了更多的实用性
const filteredMovies=findMovies.reduce((acc,movie)=>{
if(movie.poster_path==null){
//log('拒绝:',电影,'原因:没有照片')
movie.rejectReason='无照片'
acc.拒绝.推送(电影)
返回acc
}
如果(电影人气<8){
//console.log('拒绝:',电影,'原因:评级不好')
movie.rejectReason='差评'
acc.拒绝.推送(电影)
返回acc
}
acc.比赛推送(电影)
返回acc
},{匹配项:[],拒绝项:[]})
console.log('MATCHES',filteredMovies.MATCHES)
console.log('\nREJECTS',filteredMovies.rejects)
首先,
Array.map()
Array.reduce()
Array.forEach()非常相似
。如果你已经知道这一点,那就太棒了——我爱你。他们三人都跨过一个iterable,对每一项都做些什么。区别在于map生成一个新数组,reduce可以生成任何数据结构。这使得过程不可变并且是一个良好的实践。你必须在你的数据库上研究不可变性如果你这样做了,请注意JavaScript是如何维护对非原语的实时引用的。当涉及到“共享可变状态”时,这可能会造成噩梦

其次,
Array.reduce()
比map多一点,因为它是一个累加器。如果您不熟悉,我强烈建议您学习所有关于reduce的知识。长话短说,在我的示例中,我们正在累加一个具有两个键的对象:
匹配
拒绝
。我们正在逐步处理电影数组中的每个项目,并使用您的orig对其进行分析最后的逻辑,但我把它转过来,和你的相反。它是这样的:

1) 检查每部电影

2) 如果
movie.poster\u path==null
:电影是拒绝,请将其推入我们正在累积的拒绝数组中。使用
=
将捕获所有错误值,例如
'
0
未定义的
,以及
null

3) 如果
movie.popularity<8
:movie是拒绝,请将其推入我们正在累积的拒绝数组中

4) 在我们移动到列表中的下一部电影之前,我们在电影结果中添加一个
rejectReason
属性(以防我们以后要检查它或在错误消息中显示它)

5) 请注意reduce函数是一个导致拒绝的if语句列表,最后一步是:“如果电影还没有被拒绝,请将其添加到我们正在累积的
匹配数组中

奖金通知
acc
代表累加器。如果你仔细看,我们在积累一些东西,而reduce函数在每个项目上循环。当它说
返回acc
时。这意味着,返回累加器,以便下一个项目也可以使用它

因为你在这个问题上花了很长时间,我想帮助你理解
const result = findMovies.filter(movies => movies.popularity > 8);
console.log(result);