Как удалить конкретный результат из списка результатов в массиве

#javascript

#javascript

Вопрос:

У меня есть следующая функция, которая собирает результаты из моей базы данных, а затем передает некоторые результаты в геокодер mapbox. Однако я хочу поместить в него некоторую ошибку, чтобы, когда геокодер вернет нулевое / неопределенное значение для адреса, он удалит не только это неопределенное значение, но и все остальное, связанное с этим результатом.

Я пытаюсь удалить определенный элемент, используя метод .splice, в то время как он обнаруживает, что существует неопределенное значение, он затем удаляет весь результат addresses из массива, а не только один адрес и все остальные результаты. (Я предполагаю, что, скажем, если адрес 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. Как насчет Array.filter() ?

2. Как я могу заставить это удалить целую строку элементов?

3. Я думаю, вам было бы лучше не добавлять строку в первую очередь.

4. итак, ловим его в promise.all (значения) или где-то еще?

Ответ №1:

Я думаю, что этот код можно лучше переработать, чтобы достичь того, что вы хотите сделать. Как отмечено в моем комментарии, вам было бы лучше не добавлять новую строку, если она не пройдет ваш тест. Что-то вроде:

 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;
});