Tengo un sitio web donde puedo comparar productos almacenados dentro de una matriz (con objetos). Quiero agregar diferentes filtros de una matriz dentro de un objeto que se apliquen juntos.
Para dos filtros, puedo hacerlo fácilmente (vea mi código a continuación). Solo comparo dos objetos y uso un filtro dependiendo de su contenido.
Pero, ¿cuál sería un buen enfoque para usar el filtro si hay más de dos objetos? ¿Puedo recorrer el objeto y comparar si las matrices están vacías?
Con mi enfoque actual, tendría que extender mi código para cada filtro nuevo y se inflaría.
Quiero verificar qué objetos de filtro tienen datos en su matriz de "características" (esa matriz se llena después de que el usuario hace clic en un filtro en el sitio) y si es así, quiero usar estas matrices para filtrar la matriz filteredArray principal.
features_collection: { aspect_ratio_object: { features: [], value: "Aspect Ratio", }, performance_rating_object: { features: [], value: "Performance Rating", }, }, if ( features_collection.aspect_ratio_object.features.length && features_collection.performance_rating_object.features.length ) { return filteredArray.filter( (obj) => features_collection.aspect_ratio_object.features.includes( obj[features_collection.aspect_ratio_object.value] ) && features_collection.performance_rating_object.features.includes( obj[features_collection.performance_rating_object.value] ) ); } else if ( features_collection.aspect_ratio_object.features.length || features_collection.performance_rating_object.features.length ) { return filteredArray.filter( (obj) => features_collection.aspect_ratio_object.features.includes( obj[features_collection.aspect_ratio_object.value] ) || features_collection.performance_rating_object.features.includes( obj[features_collection.performance_rating_object.value] ) ); } },También puedo cambiar mi objeto. ¿Podría convertirlo en una matriz de objetos si eso facilitara las cosas?
Obviamente tienes demasiado bucle a través de tu objeto.
Aquí está su código de bucle para Features_Collection:
features_collection.forEach(function (item, index) { console.log(item, index); });Hacer que sus filtros sean una array parece más práctico. Aquí hay un ejemplo de cómo filtrar un conjunto de objetos contra su feature_collection de características.
function filter_by_features(targets, feature_collection) { // Start right of to filter the `filteredArray` return targets.filter(obj => { // go through every feature and test it against the current object. // every() returns either true or false and the targets array is filtered // by that condition supplied within the callback of `every()` return feature_collection.every(filter => { // If for a given feature no filter is available, return true // so the test for this filter passes. if(filter.features.length === 0) { return true } // there are features, check if any applies. return filter.features.includes(obj[filter.value]) }) }) } // feature collection (as array) const feature_collection = [ { features: [], value: "Aspect Ratio", }, { features: [], value: "Performance Rating", } ] // the objects you want to filter. const objects_to_filter = [/* ... */] const filtered = filter_by_features(objects_to_filter, feature_collection)