Source

Body/Project/Filtering/FilterFunction.js

import { getRelationSign } from "../../../Utils/utilFunctions/parseItems/parseDetails";

const relationSigns = ["<=", ">="];

/**
 * <h3>Overview</h3>
 * Looks for at least one match in filter features.
 * When filterText contains more than one word, all of them have to be found in at least one filter feature.
 *
 * @function
 * @category Project
 * @subcategory Filtering
 * @param {string} filterText - Input from {@link FilterTextField}.
 * @param {Object[]} items - The list of items from {@link ResultList}.
 * @returns {Object[]} - Filtered list of items.
 */
const filterFunction = (filterText, items) => {
    if (filterText === "") {
        return items;
    } else {
        let filters = filterText.toString().toLowerCase().split(" ");

        let displayedItems = [];
        for (let i = 0; i < items.length; i++) {
            const object = {...items[i]};
            let objectFeatures = object.toFilter();

            let matchAll = false;
            for (let j = 0; j < objectFeatures.length; j++) {
                let match = true
                for  (let k = 0; k < filters.length; k++) {
                    if (relationSigns.includes(filters[k])) {
                        filters[k] = getRelationSign(filters[k]);
                    }

                    if(!objectFeatures[j].includes(filters[k])) {
                        match = false;
                        break;
                    }
                }
                if (match) {
                    matchAll = true;
                    break;
                }
            }
            if (matchAll) {
                displayedItems = [...displayedItems, object];
            }
        }
        if (displayedItems.length > 0) {
            return displayedItems;
        } else {
            return null;
        }
    }
};

export default filterFunction;