【问题标题】:multiple calls from for loop to array, then drop 0 length results从 for 循环多次调用数组,然后删除 0 长度结果
【发布时间】:2018-10-17 21:41:45
【问题描述】:

这就是我想要实现的目标,我正在调用一个 api,导致基于邮政编码和半径的多个调用。根据人口密度,结果可能少至一个或多至二十个。此调用的结果作为没有信息的数组返回到多个条目。我需要做的是获取多个单独的数组并创建一个数组,该数组删除所有空数组并将每个单独的数组附加到一个数组中。当前进行多次调用的代码是:

const https = require('https');
const fetch = require('node-fetch');
var zipcodes = require('zipcodes');

var food_truck_zip = '29615'

var userzip = food_truck_zip

var user = zipcodes.lookup(userzip);
//console.log(user);

var rad = zipcodes.radius(userzip,4);

array = rad;
for (var i=0; i<array.length; i++)
    var zipsArray = array;
    for(let i=0;i<zipsArray.length; i++) {
      fetch('https://36245d69.ngrok.io/api/vendor_filter/?zipCode=' + 
      zipsArray[i])
        .then(response => {
         return response.json();
        })
        .then(function handleData(data) {
          var buildOutput = [];
          buildOutput.push(data);
          console.log(JSON.stringify(buildOutput));
        })
        .catch(function handleError(error) {

        });
   };

console.logs 到 buildOutput 的结果如下所示:

[[]]
[[]]
[[]]
[[{"truckName":"Chuck Truck","locationName":"Butler Springs 
Estate","locationAddress":"Butler Springs Road","beginning":"10:00 
am","ending":"05:00 pm"},{"truckName":"Henry's Hog 
Hauler","locationName":"Strange Brew","locationAddress":"1100 Wade 
Hampton","beginning":"06:30 pm","ending":"08:30 pm"}, 
{"truckName":"Chuck Coffee Crusted Salmon","locationName":"The Home 
Base","locationAddress":"Butler Springs Estates","beginning":"04:30 
pm","ending":"06:00 pm"}]]
[[]]
[[{"truckName":"ThoroughFARE","locationName":"Grateful 
Brew","locationAddress":"800 North Pleasantburg","beginning":"04:30 
pm","ending":"07;00 pm"}]]
[[]]

因此,这个半径为 4 英里的邮政编码的结果是 7 个邮政编码,其中 2 个当前有条目。对此的帮助将不胜感激,将七个单独的调用放入一个数组中,然后删除任何零条目。

【问题讨论】:

  • 您在外循环中隐藏了 i 变量。最好选择一个不同的变量名称,例如j,或者完全避免for 循环并使用forEachmap 之类的请求,这样您就可以继续使用Promise.all。另外,不要混合使用 varconst - 最好始终使用 const

标签: javascript arrays node-fetch


【解决方案1】:

也许以下内容会有所帮助,您的代码在同一个数组上循环两次没有多大意义,您的内部数组与您的外部数组相同。

function Fail(reason){this.reason=reason;};
const isFail = o => (o&&o.constructor)===Fail;
const isNotFail = o => !isFail(o);

Promise.all(
  rad.map(
    zip =>
      fetch('https://36245d69.ngrok.io/api/vendor_filter/?zipCode=' +
      zip)
      .then(response => {
        return response.json();
      })
      .then(function handleData(data) {
        console.log("got data:",JSON.stringify(data));
        return data.map(
          //add zip to item, your question does not show zip but comment askes
          // for zip to be there
          item=>({...item,zip})
        );
      })
      .catch(function handleError(error) {
        err=>new fail([err,zip])
      })
  )
).then(
  results => {
    console.log(
      "successes:",
      results
        .filter(isNotFail)
        .filter(item=>!!item.length)//remove empty items
        .reduce((result,item)=>result.concat(item))//flatten array of array to one array
    );
    results.filter(isFail).forEach(
      ([error,zip])=>console.log("failed:",zip,"with error:",error)
    )
  }
)

【讨论】:

  • 只是要清楚第一个循环创建的 api 调用设置的半径中的每个邮政编码都不同,所以这发生在第一个循环中,29615 是用户群,数字随着半径的扩大而变化。我不确定你是否考虑到了这一点,我的代码在没有创建循环的情况下不会发生这种情况。
  • @ChuckLaPress rad、array 和 zipArray 在您发布的代码中都相同。也许您正在想象一些您没有发布的其他代码,或者您发布了错误的代码,但即使您发表评论,问题中的内容也没有多大意义。
  • 对不起@HMR 我没有质疑你的答案,我只是说为什么我认为我需要循环两次,我发布了我的完整代码以及为什么我认为它需要循环两次.对不起,如果我冒犯了你,我真的很感谢你的回答。谢谢
  • 所以 isFail 和 isNotFail 作为过滤器运行,在执行代码时我仍然将 [] 记录为:得到数据:[] 和成功:[[],那么过滤器中有没有办法消除这些的方法。再次感谢您抽出宝贵时间回答。
  • @ChuckLaPress 这没什么大不了的,请查看您在问题中发布的代码并尝试弄清楚它的作用。创建用户并且从不使用它,创建对同一个数组的 3 个引用并将其用于嵌套循环,这没有多大意义。我希望答案对您有所帮助,但如果没有,请使用一些有意义或描述您正在尝试做什么的代码更新您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多