網站搜尋

javascript - 在不知道鍵的情況下的通用過濾函數


我想要製作一個通用的 JavaScript 方法,在不知道鍵值的情況下過濾列表。

這就是我目前為止做到的程度,但我不知道該如何繼續。我知道這個 foreach 代碼不正確,但我這樣寫是為了讓你更容易理解我想做的事情。

有人可以幫忙嗎?

filterList(): void {
    let searchtext = this.state.currentSearchBoxValue;
    let searchProperties = this.state.searchBoxOptions.searchProperties;

    let list = this.props.list;

    if(searchtext != undefined && searchtext != '' && searchtext != null) 
    {
        let keys = Object.keys(list[0]);

        searchProperties.forEach(key => {
            list.filter(item => item[key].includes(searchtext));
        })
    }     
}

答案#1

或許你可以修改你的過濾邏輯,使得傳遞給你的 list 陣列的 filter() 的回呼函數,如下面詳述的,包裝對 searchProperties 的迭代:

filterList(): void {
    let searchtext = this.state.currentSearchBoxValue;
    let searchProperties = this.state.searchBoxOptions.searchProperties;

    let list = this.props.list;

    if(searchtext != undefined && searchtext != '' && searchtext != null) 
    {    
        /* Call filter to filter items that match search criteria */
        const filteredList = list.filter(item => {

            /* Search for any property where the some() criteria is true for 
               current item */
            return searchProperties.some(searchProperty => {

                /* If item value on current searchProperty key includes searchText, 
                   return true. This means some() will return true, and
                   the "item" will be included in filteredList */
                const itemPropertyValue = item[ searchProperty ];

                return itemPropertyValue.includes(searchtext);
            });
        });

        /* Filtered result */
        console.log(filteredList);
    }     
}

如上所示,這個解決方案使用了 .some() 方法在 searchProperties 陣列上,如果傳遞給 some() 的回呼函數對 searchProperties 陣列中的任何項目返回 true,則會返回 true。

希望這對你有幫助!