如何从数组中的结果列表中删除特定结果

时间:2019-03-28 14:03:07

标签: javascript

我具有以下功能,该功能从数据库中获取结果,然后将一些结果传递给mapbox地理编码器。但是我想在其中捕获一些错误,以便当地址解析器返回该地址的空值/未定义值时,它不仅会删除该未定义值,还会删除附加到该结果的所有内容。

我正在尝试使用.splice方法删除特定的元素,虽然它检测到存在未定义的值,但是它将从数组中删除整个地址结果,而不仅仅是一个地址和所有其他结果。 (我假设如果未定义地址3,则可以删除数组中位于位置3的所有内容,因为这将是附加到该地址值的结果),

因此,如下所述

       let projects = values.map(elmt => elmt[5])

我想检查从地址解析器返回的所有未定义或空值的地方吗?

功能

  function grabProjects() {
    sql = 'SELECT o.Name, o.Project_Type, o.sDate, o.eDate, p.Role, p.Project_Org_Address, p.Project_Org_Name,p.Country_Name, p.Country_Name, f.Funder_Name, per.Person_Name FROM project_name_table o INNER JOIN project_collaborators p ON o.Project_ID = p.Project_ID INNER JOIN project_funders f ON f.Project_ID = o.Project_ID INNER JOIN person per ON o.person_fk = per.Person_ID GROUP BY o.Project_ID LIMIT 20'
  projectsArray = []

    let query = conn.query(sql, (err, results) => {
      if (err) throw err;



      const geoPromise = param => new Promise((resolve, reject) => {
        geo.geocode('mapbox.places', param, function (err, geoData) {
          if (err) return reject(err);
          if (geoData) {
            resolve(geoData.features[0])
          } else {
            reject('No result found');
          }
        });
      });



      const promises = results.map(result =>

        Promise.all([
          result.Name,
          result.Project_Type,
          result.sDate,
          result.eDate,
          result.Role,
          geoPromise(result.Project_Org_Address),
          result.Project_Org_Name,
          geoPromise(result.Country_Name),
          result.Country_Name,
          result.Funder_Name,
          result.Person_Name

        ])

      );

      Promise.all(promises)
        .then((values) => {

          let pNames = values.map(elmt => elmt[0])
          let pType = values.map(elmt => elmt[1])
          let sDate = values.map(elmt => elmt[2])
          let eDate = values.map(elmt => elmt[3])
          let roles = values.map(elmt => elmt[4])
          let projects = values.map(elmt => elmt[5])
          let collabNames = values.map(elmt => elmt[6])
          let countryNames = values.map(elmt => elmt[7])
          let countryProjects = values.map(elmt => elmt[8])
          let names = values.map(elmt => elmt[9])
          let person_name = values.map(elmt => elmt[10])

          projectsArray.push(pNames, pType, sDate, eDate, roles, projects, collabNames, countryNames, countryProjects, names, person_name)
          console.log(projectsArray.length)

          for (i = 0; i < projectsArray.length; i++) {
            console.log(projectsArray[5][i])
            if (projectsArray[5][i] === undefined) {
              console.log('true')
              projectsArray.splice(i, 1)
              console.log('new length', projectsArray.length)


            }
            else {
              console.log('false')
            }
          }
        })


    });





    return projectsArray



  }

1 个答案:

答案 0 :(得分:0)

我认为可以更好地重构此代码,以实现您想要执行的操作。如我的评论所述,最好不要添加新行,除非它通过了测试。类似于:

function grabProjects() {
    // ...
    projectsArray = []

    let query = conn.query(sql, (err, results) => {
      ...//
      results.forEach(async (result) => {
           const parsedResult = result
           const address = await geoPromise(result.Project_Org_Address;
           const country = await geoPromise(result.Country_Name);
           result.address = address;
           result.country = country;

           const propUndefined = Object.keys(result).filter((key) => result[key] === undefined).length > 0;

           if (!propUndefined) {
               projectsArray.push(Object.keys(result).map((key) => result[key]);
           }

        //...

    return projectsArray;
});