All Downloads are FREE. Search and download functionalities are using the official Maven repository.

components.Table.utils.index.ts Maven / Gradle / Ivy

The newest version!
/* eslint-disable @typescript-eslint/no-explicit-any */
// В примерах ниже используются циклы while исключительно для ускорения работы скриптов

export const excludeItems = (originalArray: T[], excludeArray: T[]): T[] => {
    const excludeSet = new Set(excludeArray)
    const resultArray = []
    let i = 0

    while (i < originalArray.length) {
        const currentItem = originalArray[i]

        if (!excludeSet.has(currentItem)) {
            resultArray.push(currentItem)
        }
        i += 1
    }

    return resultArray
}

export function getAllValuesByKey <
    T extends object,
    KeyToIterate extends keyof T,
    KeyToExtract extends keyof T,
>(data: T[], options: { keyToIterate?: KeyToIterate, keyToExtract: KeyToExtract }): Array
export function getAllValuesByKey <
    T extends object,
    KeyToIterate extends keyof T,
>(data: T[], options: { keyToIterate?: KeyToIterate }): T[]
export function getAllValuesByKey <
    T extends object,
    KeyToIterate extends keyof T,
    KeyToExtract extends keyof T,
// eslint-disable-next-line max-len
>(data: T[], options: { keyToIterate?: KeyToIterate, keyToExtract?: KeyToExtract }) {
    const result: any = []
    const stack: T[] = [...data]

    const { keyToIterate, keyToExtract } = options

    while (stack.length) {
        const node = stack.pop()

        if (!node) {
            // eslint-disable-next-line no-continue
            continue
        }

        let extractValue

        if (keyToExtract !== undefined) {
            extractValue = node[keyToExtract]
        } else {
            extractValue = node
        }

        if (extractValue !== undefined && extractValue !== null) {
            result.unshift(extractValue)
        }

        if (!keyToIterate) {
            // eslint-disable-next-line no-continue
            continue
        }

        const iterableField = node[keyToIterate]

        if (Array.isArray(iterableField)) {
            stack.push(...iterableField)
        }
    }

    return result
}

/**
 * @description Функция возвращает new Map() значения из keyToExtract, если у объекта, что содержит keyToExtract есть поле по ключу keyToSearch
 * @param {array} data
 * @param {object} options
 * @param options.keyAsHash - Значение по этому ключу будет использоваться в качестве хеша для мапы
 * @param [options.keyToIterate] - Опциональный ключ по которому будет совершаться рекурсивный обход.
 */
export const getHashMapFromData = <
    T,
    KeyToIterate extends keyof T,
    KeyAsHash extends keyof T,
>(data: T[], options: { keyToIterate?: KeyToIterate; keyAsHash: KeyAsHash }): Map => {
    const { keyToIterate, keyAsHash } = options
    const resultMap = new Map()

    function traverse(item: T) {
        const hash = item[keyAsHash]

        if (hash !== undefined && hash !== null) {
            resultMap.set(hash, item)
        }

        if (!keyToIterate) {
            return
        }

        const iterateItem = item[keyToIterate]

        if (Array.isArray(iterateItem)) {
            for (const nestedItem of iterateItem) {
                traverse(nestedItem)
            }
        }
    }

    for (const item of data) {
        traverse(item)
    }

    return resultMap
}

/**
 * Функция возвращает массив значения из keyToExtract, если у объекта, что содержит keyToExtract есть поле по ключу keyToSearch
 * @param {array} data
 * @param {object} options
 * @param options.keyToExtract - Значение которое будет добавлено в возвращаемый массив
 * @param options.keyToSearch - Ключ который будет искаться в объекте, если он есть, значение keyToExtract будет добавлено в возвращаемый массив
 * @param [options.keyToIterate = options.keyToSearch] - Опциональный ключ по которому будет совершаться рекурсивный обход. По умолчанию равен keyToSearch
 * @param [options.equalFunc] - Функция по результатам которой будет решено нужно ли добавить искомый элемент в возвращаемый массив
 */
export const getValueBySearchKey = <
    T extends Record,
    KeyToExtract extends keyof T,
    KeyToSearch extends keyof T,
    KeyToIterate extends keyof T,
>(data: T[], options: {
        keyToExtract: KeyToExtract,
        keyToSearch: KeyToSearch,
        keyToIterate?: KeyToIterate,
        equalFunc?(data: T): boolean
    }) => {
    const { keyToExtract, equalFunc, keyToSearch, keyToIterate = keyToSearch } = options

    const defaultEqualFunc = (data: T) => data[keyToSearch] !== undefined
    const resolvedEqualFunc = equalFunc || defaultEqualFunc
    const result: Array = []

    const traverse = (items: T[]) => {
        for (const item of items) {
            const isNeedAddValue = resolvedEqualFunc(item)

            if (isNeedAddValue) {
                result.push(item[keyToExtract])
            }

            if (Array.isArray(item[keyToIterate])) {
                traverse(item[keyToIterate])
            }
        }
    }

    traverse(data)

    return result
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy