Ограничить поиск в таблице определенными значениями динамического ключа в Javascript ArrayObjects

#javascript #arrays #ecmascript-6 #filter

#javascript #массивы #ecmascript-6 #Фильтр

Вопрос:

Я создаю пользовательский поиск, и у меня есть массив объектов.

 const data = [{
    name: "Janet McKenly",
    age: 49,
    city: "Baltimore",
    active: "2019-02-15",
    role: "Admin. Assistant"
  },
  {
    name: "Eric Brown",
    age: 23,
    city: "Dallas",
    active: "2020-06-01",
    role: "Janitor"
  },
  {
    name: "Nora Payne",
    age: 41,
    city: "Los Angeles",
    active: "2020-10-02",
    role: "Sales Associate"
  }
]
 

У меня есть другой динамически создаваемый массив, который позволяет выполнять поиск только по определенным параметрам.

 let searchColumnOnlyArray = ["name", "city", "active"]; // (generated dynamically)
 

role amp; age не должен быть доступен для поиска.

Цель состоит в том, чтобы искать только значения для ключей, установленных searchColumnOnlyArray в.

Я могу фильтровать, жестко кодируя параметр name [«name»], но searchColumnOnlyArray он динамический и будет меняться… ниже приведен метод, который я использую:

 searchTable(term: any, data: any) {
   let search = data.filter((indivitem: object) => {
       if(indivitem["name"] === term) {
         return indivitem;
       }
   }
   console.log("searchResults", search);
}
 

Мне нужен совет о том, как использовать my searchColumnOnlyArray только для поиска значений в этих ключах. Совет о том, как я могу ограничить свой фильтр для поиска / поиска значений с помощью заданных ключей в searchColumnOnlyArray ?

Ответ №1:

Вы можете использовать .some() метод для каждого отдельного элемента в обратном вызове фильтра. С .some() помощью метода вы можете перебирать массив столбцов и возвращать true , когда одно из заданных значений столбца (т.Е. Ключи) Содержит значение, соответствующее вашему поисковому запросу. Если ваш .some() обратный вызов никогда не возвращает true, и false для каждого элемента / ключа столбца результат вызова .some() будет false , что приведет к тому, что метод filter не сохранит элемент в конечном результирующем массиве:

 const data = [ { name: "Janet McKenly", age: 49, city: "Baltimore", active: "2019-02-15", role: "Admin. Assistant" }, { name: "Eric Brown", age: 23, city: "Dallas", active: "2020-06-01", role: "Janitor" }, { name: "Nora Payne", age: 41, city: "Los Angeles", active: "2020-10-02", role: "Sales Associate" } ];

const searchColumnOnlyArray = ["name", "city", "active"];
const term = "Dallas";
const search = data.filter(item =>
  searchColumnOnlyArray.some(col => item[col] === term)
);
console.log("searchResults", search); 

Примечание: В вашем примере вы возвращаете элемент, который хотите сохранить в методе filter, хотя это работает, это не то, как вы должны использовать .filter() . Ваш обратный вызов должен возвращать true / false (или истинное / ложное значение). Когда вы возвращаете true , текущий элемент сохраняется в результирующем массиве, возвращаемом .filter() , если вы возвращаете false , то он не сохраняется в результирующем arrray .

Ответ №2:

 data.forEach(ele => {
   searchColumnOnlyArray.forEach( search => {
       console.log(ele[search]);
   });
});
 

Я не могу попробовать код прямо сейчас, но это должно выполнить эту работу