Как отфильтровать каждый объект массива по содержанию определенной строки в любом из полей
У меня есть html-таблица объектов, и мне нужно реализовать поиск. Он будет происходить по совпадению строки в любом из полей объекта. Так как я не совсем хорошо знаю js, застрял на этом моменте. Вот то, что я написал:
@Pipe({
name: 'filterProducts'
})
export class FilterProductsPipe implements PipeTransform {
transform(sensors: ISensor[], query: string): ISensor[] {
let resultSensors: ISensor[] = []
let sensor: ISensor = {
id: 0, name: '', unit: '', type: '', description: '', location: '', model: '', range_from: 0, range_to: 0
}
const keys: string[] = Object.getOwnPropertyNames(sensor)
for (let i = 0; i < sensors.length; i++){
keys.forEach(key => {
})
}
return resultSensors
}
}
Далее мне нужно по каждому из полей проверять, содержит ли оно строку, если да, то добавлять объект в новый массив, но тут я застрял, так как sensors[i][key] выдает ошибку, да и некоторые поля являются числовыми и у них не будет метода includes, как мне тут поступить?
Ответы (1 шт):
Автор решения: Armen
→ Ссылка
метод .filter филтрует исходный и возврашяет отфилтровонный новый массив.
const query = "1";
const sensors: Record < string, unknown > [] = [{
id: 1,
},
{
id: 21111,
},
{},
{
x: "321"
},
{
id: {
x: "sss",
},
},
];
class FilterProductsPipe {
static getSensorsByQuery(sensors, query) {
const filteredSensors = sensors.filter((sensor) => {
return Object.values(sensor).find((value) => {
const isValidValue =
value && (typeof value === "string" || typeof value === "number");
//Точное: {id: 1}
return isValidValue && value.toString() === query;
// Все совподения вроде: {2111}, {321}
// return isValidValue && value.toString().toLowerCase().includes(query);
});
});
return filteredSensors;
}
}
console.log(FilterProductsPipe.getSensorsByQuery(sensors, query))