Как мне отфильтровать список, используя параметры внутри вложенного объекта? - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть list, который я хочу отфильтровать, используя параметры из advancedSearchFilters, который имеет вложенные объекты. Я хочу вернуть список, который соответствует всем параметрам, если таковые имеются.

const list = [
  {
    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
  },
  {
    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
  },
  {
    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
  },
];
const advancedSearchFilters = {
      companyName: {
        modifier: 'equals',
        value: 'Test Company'
      },
      price: {
        modifier: 'greaterThan',
        value: '54'
      },
      driver: {
        modifier: 'equals',
        value: 'Robert'
      }
    };

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;
};

const resultList = list.filter(
                item => Object.entries(advancedSearchFilters).every(([filterKey, filterVal]) => {
                    const compareValue = item[filterKey].value;
                    const value = keys[filterKey];
                    list = handleFilterModifier(
                        parseFloat(value),
                        compareValue,
                        filterVal
                    );
                    return list;
                })
            );

Вышеприведенная функция resultList возвращает ошибку.

Я полагаю, что проблема возникает при попытке получить параметры запроса изнутри advancedSearchFilters. Этот код поможет мне выполнить sh запрос расширенного поиска.

1 Ответ

1 голос
/ 26 февраля 2020

Как говорит user3773048 в комментарии, у объекта нет filter метода. Массив, однако, делает.

Вместо list.filter(item => ...) вы можете извлечь свою внутреннюю функцию, возможно, назвать ее predicate следующим образом:

const predicate = item => ...

Затем использовать ее следующим образом:

const resultList = Object.entries(list).reduce(
  (filteredList, [key, item]) => {
    if (predicate(item)) {
      filteredList[key] = item;
    }
    return filteredList;
  },
  {}
);

Метод Object.entries() выдает пары ключ / значение объекта в виде массива, а reduce() позволяет уплотнять список обратно в пары ключ / значение в объекте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...