спасибо, что взглянули на это. Извините за длину, пытаюсь быть понятным!
ЧТО Я ПЫТАЮСЬ СДЕЛАТЬ: У меня есть массив пользователей (каждый пользователь - объект), и я пытаюсь отфильтровать пользователей по нескольким критерии («мужчины из Франции» или «женщины из Испании и Соединенных Штатов с инженерными навыками» и т. д. c), но до сих пор это доказано за пределами моих навыков.
Сложность заключалась в том, что пользователи являются объектами в массиве User, но в каждом пользовательском объекте некоторые значения являются дополнительными объектами или массивами. Вот как выглядит массив пользовательских данных (сокращенно):
let users = [
{
gender: 'male',
location: {street: 'Clement Street', country: 'United States'},
skills: ['engineering', 'underwater'],
}, ...
Обратите внимание, что пол - это просто обычное свойство / значение, но страна находится внутри объекта местоположения, а навыки - в массиве.
У меня уже есть интерфейс кнопок поиска, который создает кнопки переключения для поиска по каждому доступному критерию, и каждый раз, когда вы нажимаете кнопку, я добавляю или удаляю эти критерии в объекте фильтра. Объект фильтра выглядит следующим образом и использует массивы внутри него, так что я могу определить несколько критериев одновременно, например, несколько стран для поиска, несколько навыков и т. Д. c .:
filter: {
gender: ['female'],
location: {
country: ['Spain'],},
skills: ['optics', ]
},
ГДЕ Я ДЕЙСТВИТЕЛЬНО ПОЛУЧИЛ STUCK Я создал метод filterData, который может успешно фильтровать по полу (мужской или женский), но не может получить его также для фильтрации по стране (в пределах объекта местоположения) или навыкам (в массиве навыков). ). Мой текущий метод filterData проходит только одну итерацию для каждого пользователя, но я попытался использовать циклы For и forEach, чтобы попытаться go выполнить каждый из критериев фильтра («Испания», «Оптика»), но он просто не работает , Я получаю только пол.
Я думаю, что у меня есть две проблемы: 1) каким-то образом передать в коде, что в некоторых случаях «ключ» элемента будет не значением, а объектом или массивом, который также должен быть найден внутри, и 2) создание своего рода циклического поведения, которое будет go проходить через каждый из критериев фильтра, вместо остановки после первого (пол).
Это, очевидно, сейчас у меня над головой, так что любые советы или предложения будут оценены, большое спасибо! И вот весь код, с которым я работал, включая мой метод filterData.
var filtering = {
filter: {
gender: ["female"],
location: {
country: ["Spain"],
},
skills: ["optics"],
},
users: [
{
gender: "male",
name: "John",
location: { street: "Clement Street", country: "United States" },
skills: ["engineering", "underwater"],
},
{
gender: "female",
name: "Mary",
location: { street: "5th Avenue", country: "Spain" },
skills: ["confidence", "optics"],
},
{
gender: "male",
name: "David",
location: { street: "Vermont Ave", country: "France" },
skills: ["cards", "metalurgy", "confidence"],
},
{
gender: "female",
name: "Rachel",
location: { street: "Vermont Ave", country: "France" },
skills: ["disguise", "electrical"],
},
{
gender: "female",
name: "Muriel",
location: { street: "Vermont Ave", country: "Germany" },
skills: ["flight", "surveillance"],
},
],
filterData: (filter) => {
const filteredData = filtering.users.filter((item) => {
for (let key in filter) {
if (!filter[key].includes(item[key])) {
return false;
}
return true;
}
});
console.log(filteredData);
},
};
filtering.filterData(filtering.filter);