【问题标题】:filter array of object using lodash or underscore使用 lodash 或下划线过滤对象数组
【发布时间】:2021-01-06 13:40:22
【问题描述】:

我有以下结构,并且此数据显示为列表(如我给定的屏幕截图所示),在这里我想添加一个过滤器,例如如果我在搜索框中输入“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一样写全名时它也会返回对象数组

[
    { 
      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"
        },
      ]
    }
 ]

【问题讨论】:

    标签: javascript arrays object lodash underscore.js


    【解决方案1】:

    它是基于 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”时,我们只想返回一个名称

    【讨论】:

    • 感谢回复,如果我只输入“a”会怎样?它有效还是我必须输入全名“atewart Bower”?
    • 感谢它正在工作并向我介绍新的数组方法startWith 但在这里我只得到数组 [{id: "1",name: "atewart Bower"}] 中的这个对象和我想要像 [ { alpha: "a", users: [ { id: "1", name: "atewart Bower" }, ] } ] 这样的输出,如果某人的名字以大写字符开头,我们如何解决大小写问题我还必须用大写字母输入它
    • 嗨@shashiverma,我已经稍微更改了函数以获得所需的结果。还有关于字母大小写的好消息,我在检查 startsWith 之前添加了 toLowerCase 函数以确保检查不区分大小写。
    猜你喜欢
    • 2023-03-28
    • 2015-05-13
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多