У меня есть список, который я фильтрую, чтобы вернуть результаты, которые lessThan
, greaterThan
или equals
, к определенному значению. Но функция, которая выполняет сравнение, возвращает логические значения.
queryModifiers
- это объект пар ключ-значение, который указывает, какой ключ в наборе данных сравнивается, а также тип сравнения.
const queryModifiers = {
price: "greaterThan",
weight: "lessThan",
}
const list = [
{
'2104a7bd-5e78-49ce-a1f6-0699ac98f264': {
additionalPrices: 0,
clientOrderNumber: 'N / A',
companyName: 'Test Company',
completeDate: 'Invalid date',
createdAt: '2019-09-08 16:41:43',
createdBy: 'test@test.com',
deliveryDate: '2019-09-14 16:39:25',
driver: 'Robert Kaszkiewicz',
dropOff: 'Avenida Callao 1234, Buenos Aires, Argentina',
height: 23,
isPreparingTrailer: true,
isSmsSent: true,
isTrailerReady: true,
key: '2104a7bd-5e78-49ce-a1f6-0699ac98f264',
notes: '',
pickUp: 'Poprad, Slovakia',
price: 1400,
quantity: 2,
trailer: 'einzeln',
vehicle: 'Sattel',
vehicleClass: 'Mega',
vehicleId: '12313',
vehicleReadyDate: '2019-09-27 16:41:22',
weight: 123
},
'388113f5-3927-4fe3-80d5-f2fcf1c7cedd': {
clientOrderNumber: 'N / A',
companyName: 'Test Company',
createdAt: '2019-09-26 18:32:18',
createdBy: 'test@test.com',
deliveryDate: '2019-09-20 18:31:45',
driver: 'Michal Kucharski',
dropOff: 'Logroño, Spain',
height: 0,
isPreparingTrailer: false,
isSmsSent: false,
isTrailerReady: false,
key: '388113f5-3927-4fe3-80d5-f2fcf1c7cedd',
notes: '',
orderId: '',
pickUp: '16671 Butano Place, Fontana, CA, USA',
price: 0,
quantity: 1,
trailer: '2er Pack',
vehicle: 'Sattel',
vehicleClass: 'Standard',
vehicleId: 'efgefg',
vehicleReadyDate: '2019-09-27 18:32:08',
weight: 0
},
'795e7531-8655-4e38-a576-e13483922607': {
clientOrderNumber: 'N / A',
companyName: 'Test Company',
createdAt: '2019-10-07 14:59:28',
createdBy: 'test@test.com',
deliveryDate: '2019-10-09 14:54:44',
driver: 'Pawel Marczyk',
dropOff: 'München, Germany',
height: 1150,
isPreparingTrailer: false,
isSmsSent: false,
isTrailerReady: false,
key: '795e7531-8655-4e38-a576-e13483922607',
notes: 'alle fertig, vorher anrufen',
orderId: '',
pickUp: 'Soest, Germany',
price: 5000,
quantity: 10,
trailer: '3er Pack',
vehicle: 'Sattel',
vehicleClass: 'Standard',
vehicleId: '1121+23+24',
vehicleReadyDate: '2019-10-07 14:55:19',
weight: 20000
},
] // list is an array of objects
export const handleFilterModifier = (value, compareValue, modifier) => {
if (modifier === 'lessThan') {
return value > compareValue;
}
if (modifier === 'equals') {
return value === compareValue;
}
if (modifier === 'greaterThan') {
return value < compareValue;
}
return null;
};
list.filter(
item => Object.entries(queryModifiers)
.every(([filterKey, filterVal]) => {
const compareValue = item[filterKey];
const value = Object.values(queryKeys);
const result = handleFilterModifier(
parseFloat(value),
compareValue,
filterVal
);
console.log(result); // result here returns boolean (true or false);
})
);
Где value
- это параметр, по которому запрашивается список, например, 100
compareValue
- это значение data[key]
из списка, которое соответствует сравниваемому параметру.
и modifier
- это метод сравнения, например greaterThan
, lessThan
или equals
.
Я хочу, чтобы результат возвращал элементы списка, которые совпадают, а не логические (которые на самом деле верны, когда сопоставляется с набором данных).