var data = [ {"id": 1, "area": 965, "bedrooms": 1, "floor": 3, "price": 2200}, {"id": 2,"area": 1065, "bedrooms": 2, "floor": 6, "price": 2726}, {"id": 3,"area": 401, "bedrooms": 2, "floor": 4, "price": 2726}, {"id": 4,"area": 699, "bedrooms": 3, "floor": 8, "price": 1232}, {"id": 5,"area": 661, "bedrooms": 1, "floor": 9, "price": 1277}, {"id": 6,"area": 412, "bedrooms": 1, "floor": 12, "price": 518}, {"id": 7,"area": 925, "bedrooms": 2, "floor": 10, "price": 2509}, ]; // The filters I want to apply to my raw data var filters = [ {highValue: 9, lowValue: 4, type: "floor"}, {highValue: 700, lowValue: 400, type: "area"}, ]; var filteredData = data.filter(function(item){ for(var key in filters){ //Loop through the filters, get the type and values var filterType = filters[key].type; var filterHighValue = filters[key].highValue; var filterLowValue = filters[key].lowValue; //Get the object keys from the data. //Get the particular key that matches the filterType var itemKeys = Object.keys(item); var itemKey = itemKeys.filter(function(matchedKey){ if(matchedKey == filterType){ return matchedKey; } }); //Eg., if ['floor'] == 'floor' // Check if the floor value in our data object is between the two values in our filter. if(filterType == itemKey){ if(item[itemKey] <= filterHighValue && item[itemKey] >= filterLowValue){ return item[itemKey]; } } } }); console.log(filteredData);Tengo una matriz de objetos que intento filtrar dinámicamente con otra matriz de objetos. Tengo problemas para descifrar la lógica para filtrar mis datos por todas las condiciones en mi objeto de filtro.
filteredData actualmente devuelve los objetos con los ID 2,3,4,5 y 6. Quiero que devuelva solo 3,4,5 ya que esas filas cumplen AMBAS condiciones en mi matriz de filtros. Obviamente, se devuelven 2,3,4,5 y 6 porque mi lógica solo requiere que una condición en la matriz sea verdadera, pero no estoy seguro de qué hacer al respecto.
Puede iterar los filtros y verificar si todas las restricciones son verdaderas.
const data = [{ id: 1, area: 965, bedrooms: 1, floor: 3, price: 2200 }, { id: 2, area: 1065, bedrooms: 2, floor: 6, price: 2726 }, { id: 3, area: 401, bedrooms: 2, floor: 4, price: 2726 }, { id: 4, area: 699, bedrooms: 3, floor: 8, price: 1232 }, { id: 5, area: 661, bedrooms: 1, floor: 9, price: 1277 }, { id: 6, area: 412, bedrooms: 1, floor: 12, price: 518 }, { id: 7, area: 925, bedrooms: 2, floor: 10, price: 2509 }], filters = [{ highValue: 9, lowValue: 4, type: "floor" }, { highValue: 700, lowValue: 400, type: "area" }], result = data.filter(o => filters.every(({ highValue, lowValue, type }) => o[type] >= lowValue && o[type] <= highValue )); console.log(result); .as-console-wrapper { max-height: 100% !important; top: 0; }Puede usar la función Array.prototype.every para verificar que todo el conjunto de condiciones es verdadero.
const data = [{ id: 1, area: 965, bedrooms: 1, floor: 3, price: 2200 }, { id: 2, area: 1065, bedrooms: 2, floor: 6, price: 2726 }, { id: 3, area: 401, bedrooms: 2, floor: 4, price: 2726 }, { id: 4, area: 699, bedrooms: 3, floor: 8, price: 1232 }, { id: 5, area: 661, bedrooms: 1, floor: 9, price: 1277 }, { id: 6, area: 412, bedrooms: 1, floor: 12, price: 518 }, { id: 7, area: 925, bedrooms: 2, floor: 10, price: 2509 }]; const filters = [ {highValue: 9, lowValue: 4, type: "floor"}, {highValue: 700, lowValue:400, type: "area"},]; const result = data.filter(o => { return filters.every(({highValue, lowValue, type}) => { return o[type] <= highValue && o[type] >= lowValue; }); }); console.log(result); .as-console-wrapper { max-height: 100% !important; top: 0; }Puede filter aquellos objetos de datos donde every condición de filtro sea cierta.
const data = [ { id: 1, area: 965, bedrooms: 1, floor: 3, price: 2200 }, { id: 2, area: 1065, bedrooms: 2, floor: 6, price: 2726 }, { id: 3, area: 401, bedrooms: 2, floor: 4, price: 2726 }, { id: 4, area: 699, bedrooms: 3, floor: 8, price: 1232 }, { id: 5, area: 661, bedrooms: 1, floor: 9, price: 1277 }, { id: 6, area: 412, bedrooms: 1, floor: 12, price: 518 }, { id: 7, area: 925, bedrooms: 2, floor: 10, price: 2509 }, ], filters = [ { highValue: 9, lowValue: 4, type: "floor" }, { highValue: 700, lowValue: 400, type: "area" }, ], filteredData = data.filter((d) => filters.every((f) => d[f.type] >= f.lowValue && d[f.type] <= f.highValue) ); console.log(filteredData);