使用 lodash 或下划线过滤对象数组

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

它 return 是基于用户数组中的“alpha”而不是“name”。我试图使用 Lodashunderscore.js,但也没有找到我想要实现的目标。

我尝试了 Lodash

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

但它也是 return 当我像 this.state.searchUserName = atewart Bower

一样写全名时的对象数组
[
    { 
      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”

时,我们只想 return 一个名字