【问题标题】:Filter JSON object array on multiple values or arguments javascript在多个值或参数上过滤 JSON 对象数组
【发布时间】:2019-02-28 13:54:47
【问题描述】:
users = [
  {
    "username": "Alice",
    "firstName": "Alice-U",
    "lastName": "Wonderland"
  },
  {
    "username": "bob",
    "firstName": "Bob-u",
    "lastName": "Builder",
  },
  {
    "username": "charly",
    "firstName": "Charly-u",
    "lastName": "Brown",
  }
]

我希望能够根据多个值过滤此数组,例如:

搜索条件:{ "username" : "Alice" } 应该返回:

{
    "username": "Alice",
    "firstName": "Alice-U",
    "lastName": "Wonderland"
}

类似:{ "username" : "charly", "firstName": "Charly-u" } 应该返回:

{
    "username": "charly",
    "firstName": "Charly-u",
    "lastName": "Brown",
}

使用 javaScript 或 jQuery 进行精确的字符串匹配。

【问题讨论】:

    标签: javascript arrays json filter attributes


    【解决方案1】:

    您可以使用.every 来检查每个条件键是否匹配:

    function filterBy(list, criteria) {
      return list.filter(candidate =>
        Object.keys(criteria).every(key =>
          candidate[key] == criteria[key]
        )
      );
    }
    
    let users = [
      { "username": "Alice", "firstName": "Alice-U", "lastName": "Wonderland" },
      { "username": "bob", "firstName": "Bob-u", "lastName": "Builder" },
      { "username": "charly", "firstName": "Charly-u", "lastName": "Brown" }
    ];
    
    console.log(filterBy(users, { "username" : "Alice" }));
    console.log(filterBy(users, { "username" : "charly", "firstName": "Charly-u" }));

    【讨论】:

    • 赞成criteria 的通用解决方案:)
    【解决方案2】:

    为什么不Array.prototype.filter()?仅过滤具有username="Alice" 的元素。顺便说一句,您可以在过滤对象数组时在过滤器的箭头函数中添加多个对象键。例如:

    user.username ==='Charly' && firstName==='Charly-u'
    

    users = [{
        "username": "Alice",
        "firstName": "Alice-U",
        "lastName": "Wonderland"
      },
      {
        "username": "bob",
        "firstName": "Bob-u",
        "lastName": "Builder",
      },
      {
        "username": "charly",
        "firstName": "Charly-u",
        "lastName": "Brown",
      }
    ];
    
    result = users.filter(user => user.username ==='Alice');
    
    console.log(result);

    【讨论】:

      【解决方案3】:

      它不能只是一个带有 for 循环的函数吗? //称呼 this.filterIt(‘用户名’,‘爱丽丝’,用户);

      //function
      Function filterIt (key, value, arr){
      result = [];
      for ( a in arr){
         if (a[key] == value) result.push(a);
      }
      return result;
      }
      

      【讨论】:

        【解决方案4】:

        你可以这样写。如果您想进行精确搜索,请编写如下搜索功能:

        function search(term) {
          return users.filter(({username, firstName, lastName}) => {
            return username.toLowerCase() === term.toLowerCase() ||
                  firstName.toLowerCase() === term.toLowerCase() ||
                  lastName.toLowerCase() === term.toLowerCase()
          })
        }
        

        可以使用object.keys 迭代所有对象属性,而不是比较每个键。

        如果你想匹配任何东西,请使用以下函数

        function search(term) {
          return users.filter(({username, firstName, lastName}) => {
            return username.toLowerCase().indexOf(term.toLowerCase()) > -1 ||
                   firstName.toLowerCase().indexOf(term.toLowerCase()) > -1 ||
                   lastName.toLowerCase().indexOf(term.toLowerCase()) > -1
           })
        }
        

        这甚至可以匹配任何地方的searchTerm。就像您将其用作search('al') 一样。它将返回第一个对象,而第一个函数需要像 search('alice') 这样的精确字符串才能工作。

        const users = [{
            "username": "Alice",
            "firstName": "Alice-U",
            "lastName": "Wonderland"
          },
          {
            "username": "bob",
            "firstName": "Bob-u",
            "lastName": "Builder",
          },
          {
            "username": "charly",
            "firstName": "Charly-u",
            "lastName": "Brown",
          }
        ]
        
        function searchFull(term) {
          return users.filter(({
            username,
            firstName,
            lastName
          }) => {
            return username.toLowerCase() === term.toLowerCase() ||
              firstName.toLowerCase() === term.toLowerCase() ||
              lastName.toLowerCase() === term.toLowerCase()
        
          })
        
        }
        
        
        function search(term) {
          return users.filter(({
            username,
            firstName,
            lastName
          }) => {
            return username.toLowerCase().indexOf(term.toLowerCase()) > -1 ||
              firstName.toLowerCase().indexOf(term.toLowerCase()) > -1 ||
              lastName.toLowerCase().indexOf(term.toLowerCase()) > -1
        
          })
        
        }
        
        console.log(searchFull('alice'))
        console.log(search('al'))

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-02-17
          • 1970-01-01
          • 1970-01-01
          • 2020-12-04
          • 2019-05-21
          • 1970-01-01
          • 2017-09-21
          相关资源
          最近更新 更多