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