Estoy tratando de filtrar objetos en función de si TODOS los términos de búsqueda dados existen en ALGUNOS de los valores de propiedad de CADA objeto en la matriz. Pero tampoco quiero buscar dentro de la propiedad deviceId .
Pero, ¿hay alguna manera de hacerlo con menos código?
Así que hago lo siguiente:
deviceId let DeviceDtoArrayOfArray = []; DeviceDtos.forEach((indiv) => { DeviceDtoArrayOfArray.push(Object.entries(indiv)); }); let DeviceDtoArrayOfArrayFiltered = []; DeviceDtoArrayOfArray.forEach((indiv) => DeviceDtoArrayOfArrayFiltered.push( indiv.filter((indiv) => indiv[0] !== "deviceId") ) ); let DeviceDtoArrayOfArrayFilteredObjects = []; DeviceDtoArrayOfArrayFiltered.forEach((indiv) => { DeviceDtoArrayOfArrayFilteredObjects.push(Object.fromEntries(indiv)); }); Matriz de muestra que contiene los objetos con deviceId
const DeviceDtos = [ { deviceId: 1, deviceName: "Device0000", hwModelName: "Unassigned", deviceTypeName: "Unassigned", serviceTag: "A1A" },...Ejemplos de términos de búsqueda
const searchTerms = ["HwModel", "A1A"];Filtrar objetos según los términos de búsqueda
const results = DeviceDtoArrayOfArrayFilteredObjects.filter((indiv) => { const propertiesValues = Object.values(indiv); // all property values return searchTerms.every((term) => propertiesValues.some( (property) => property.toLowerCase().indexOf(term.toLowerCase()) > -1 ) ); }); console.log(results);Asigne la matriz de dispositivos a una nueva matriz, donde un elemento es el dispositivo y el otro es una matriz de cadenas compuestas a partir de claves y valores (con el deviceId de dispositivo excluido con la sintaxis de reposo).
Luego, todo lo que tiene que hacer es filtrar esa matriz según si .every uno de los términos de búsqueda está incluido en .some de esas cadenas.
const DeviceDtos = [ { deviceId: 1, deviceName: "Device0000", hwModelName: "Unassigned", deviceTypeName: "Unassigned", serviceTag: "A1A" }, { notincluded: 'notincluded' } ]; const devicesAndStrings = DeviceDtos.map( ({ deviceId, ...obj }) => [obj, Object.entries(obj).flat()] ); const searchTerms = ["hwModel", "A1A"]; const foundDevices = devicesAndStrings .filter(([, strings]) => searchTerms.every( term => strings.some( string => string.includes(term) ) )) .map(([obj]) => obj); console.log(foundDevices);