Можно ли отфильтровать массив объектов в javascript с помощью подстроки? - PullRequest
3 голосов
/ 30 января 2020

Я пытаюсь отфильтровать массив объектов, используя несколько разных фильтров. В настоящее время это работает для точного соответствия, но не работает для фильтрации с использованием подстроки. Есть ли способ просто изменить эту функцию фильтра, чтобы она возвращала все значения, которые имеют частичное совпадение?

nestedFilter(data, filters) {

  let filterKeys = Object.keys(filters);
  return data.filter(function (eachObj) {
    return filterKeys.every(function (eachKey) {
      if (!filters[eachKey].length) {
        return true;
      }
      return filters[eachKey].includes(eachObj[eachKey]);
    });
  });
}

Таким образом, используя приведенные ниже данные и фильтры:

data = [
    {
        "NAME": "Johnathon", 
        "AGE": "19 ",
        "GENDER": "M",
        "SPORT": "Hockey",
        "SCHOLARSHIP": "N"
    },
    {
        "NAME": "Jessica", 
        "AGE": "20",
        "GENDER": "F",
        "SPORT": "Football",
        "SCHOLARSHIP": "Y"
    },
    {
       "NAME": "Matty", 
       "AGE": "20",
       "GENDER": "NB",
       "SPORT": "Tennis",
       "SCHOLARSHIP": "Y"
   },
   {
      "NAME": "Amy", 
      "AGE": "20",
      "GENDER": "F",
      "SPORT": "Football",
      "SCHOLARSHIP": "N"
   }
]

filters = [
   {
      "NAME": [],
      "AGE": [],
      "GENDER": [],
      "SPORT": ["Foot", "Hockey"],
      "SCHOLARSHIP": []
   }
]

Он должен вернуть Объекты Johnathon, Jessica и Amy.

(Фильтры в разных полях действуют как AND, а фильтры в том же поле действуют как OR).

Ответы [ 2 ]

1 голос
/ 30 января 2020

Чтобы использовать частичное совпадение для свойства объекта, вы должны проверить, содержит ли значение хотя бы один из элементов в списке фильтров. Например:

"Footbal".includes("Foot") || "Football".includes("Hockey") // true;

Мы можем использовать Array.some , чтобы сделать это утверждение:

return filters[eachKey].some(key => {
  return eachObj[eachKey].includes(key);
});

Небольшое исправление:

The filters переменная - это массив, поэтому вы можете либо преобразовать его в объект, либо запустить функцию nestedFilter с помощью filters[0] (ссылаясь на первый элемент в массиве)

0 голосов
/ 30 января 2020

Использование Array.reduce () , И может быть реализовано в каждой итерации

Использование Array.some () , ИЛИ может быть реализовано для каждого фильтра

Фильтр только если массив не пустой.

var data = [
    { "NAME": "Johnathon", "AGE": "19 ", "GENDER": "M", "SPORT": "Hockey", "SCHOLARSHIP": "N" },
    { "NAME": "Jessica", "AGE": "20", "GENDER": "F", "SPORT": "Football", "SCHOLARSHIP": "Y" },
    { "NAME": "Matty", "AGE": "20", "GENDER": "NB", "SPORT": "Tennis", "SCHOLARSHIP": "Y" },
    { "NAME": "Amy", "AGE": "20", "GENDER": "F", "SPORT": "Football", "SCHOLARSHIP": "N" }
];

var filters = {
      "NAME": ["Amy"],
      "AGE": [],
      "GENDER": [],
      "SPORT": ["Foot", "Hockey"],
      "SCHOLARSHIP": ["Y","N"]
   };
   
var filterkeys = Object.keys(filters);
var result = data.slice(0);
filterkeys.forEach(function(filterkey){
    if(filters[filterkey].length)
    {
        result = result.reduce(function(acc, value){
            filters[filterkey].some(function(filtervalue){
                return value[filterkey].indexOf(filtervalue)>-1;
            }) && acc.push(value);
            return acc;
        },[]);
    }
});

console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...