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

У меня есть список, который я фильтрую, чтобы вернуть результаты, которые 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.

Я хочу, чтобы результат возвращал элементы списка, которые совпадают, а не логические (которые на самом деле верны, когда сопоставляется с набором данных).

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Секция кода, которая возвращает логические значения, выглядит следующим образом:

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

Сказать это по-английски sh: если модификатор lessThan и значение больше значения сравнения, оно будет вернуть логическое значение true. Если модификатор равен и значения равны, он вернет логическое значение true. Если модификатор - moreThan и значение меньше, чем сравниваемое значение, он вернет логическое значение true. Возможно, вам нужно внимательно посмотреть на этот код и исправить его.

0 голосов
/ 19 февраля 2020

Это не полностью ясно, что вы спрашиваете, но похоже, что console.log, который у вас есть, возвращает логическое значение, но вы ожидаете, что он вернет значение, так как вы пытаетесь отфильтровать список?

Но на самом деле, вы, вероятно, do хотите, чтобы он возвращал логическое значение там, где оно есть. Он находится внутри функции every, которая сама находится внутри функции filter. Способ работы every заключается в том, что каждая итерация должна возвращать значение true или false (и, если есть какие-либо ложные значения, все возвращается false), и способ filter работает для каждого элемента, если вы возвращаете true элемент сохраняется в результирующий массив. Они оба ожидают логического возврата.

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

Строка за строкой:

  • list.filter: отфильтровать список
  • item => Object.entries(queryModifiers): установить каждый элемент в список до item, а затем получить пары ключей объекта, queryModifiers (кстати, которые вы здесь не включили)
  • .every(([filterKey, filterVal]) => {: вернуть true или false (т.е. сохранить или отбросить этот элемент), если все из queryModifiers пар ключей, отправленных в эту функцию, возвращают true
  • const compareValue = item[filterKey];: подготовить значение
  • const value = Object.values(queryKeys);: подготовить значение
  • const result = handleFilterModifier( ... ): определить истинный / ложный результат

В этот момент result должно быть истинным или ложным, указывая, является ли этот ключ / пара queryModifiers проходит ваш тест, и он должен быть возвращен , т.е. return result; Если все из них выполнят, то функция every вернет true, что означает эту итерацию функция фильтра будет включена в результат.

Итак, в основном:

const resultList = 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
                    );
                    return result;
                })
        );
console.log(resultList);
...