Как отфильтровать каждый объект массива по содержанию определенной строки в любом из полей

У меня есть 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))

→ Ссылка