#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]);
});
});
Я не могу попробовать код прямо сейчас, но это должно выполнить эту работу