簡體   English   中英

使用 lodash 或下划線過濾 object 數組

[英]filter array of object using lodash or underscore

我有以下結構,這些數據顯示為列表(如我給定的屏幕截圖),在這里我想添加一個過濾器,比如如果我在搜索框中輸入“a”,它應該顯示所有具有的名稱“a”,當我輸入全名如“atewart Bower”時,它應該只顯示一個列表。 到目前為止我這樣做

        const searchContact = newData.filter(d => { // here newData is my arr of objs                       
            let alphabet = d.alpha.toLowerCase();
            return alphabet.includes(this.state.searchUserName.toLowerCase())
        })

它基於用戶數組中的“alpha”而不是“name”返回。 我試圖使用Lodashunderscore.js ,但也沒有找到我想要實現的目標。

我試過Lodash的這段代碼

const dd = _.filter(newData, { users: [ { name: this.state.searchUserName } ]});

但是當我像this.state.searchUserName = atewart Bower這樣寫全名時,它也會返回 object 的數組

[
    { 
      alpha: "a",
      users: [
        {
          id: "1",
          name: "atewart Bower"
        },
        {
          id: "1",
          name: "aatewart Bower"
        },
      ]
    },
    { 
      alpha: "b",
      users: [
        {
          id: "1",
          name: "btewart Bower"
        },
        {
          id: "1",
          name: "bbtewart Bower"
        },
      ]
    }
 ]

在此處輸入圖像描述

它基於 alpha 進行過濾,因為在過濾器內部,我們使用 alpha 值進行檢查。

let alphabet = d.alpha.toLowerCase();
return alphabet.includes(this.state.searchUserName.toLowerCase())

要檢查用戶數組內部,你可以這樣做

const getSearchedContacts = (newData, searchUserName) => {
    const searchResults = [];
    newData.forEach((item) => {
        const users = item.users.filter(user => user.name.toLowerCase().startsWith(searchUserName.toLowerCase()));
        if (users.length) searchResults.push({...item, users});
    });
    return searchResults;
};

getSearchedContacts(yourData, 'atewart Bower'); // Returns [{"alpha":"a","users":[{"id":"1","name":"atewart Bower"}]}]

注意:我使用startsWith而不是includes因為當搜索字符串是例如“atewart Bower”時我們只想返回一個名稱

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM