【问题标题】:Javascript multiple filters arrayJavascript 多过滤器数组
【发布时间】:2023-03-08 16:10:02
【问题描述】:

我的问题是对这个问题的延伸javascript filter array multiple conditions
从那个问题如果过滤器对象是

{address: 'England', name: 'Mark'};

数组是

var users = [{
    name: 'John',
    email: 'johnson@mail.com',
    age: 25,
    address: 'USA'
  },
  {
    name: 'Tom',
    email: 'tom@mail.com',
    age: 35,
    address: 'England'
  },
  {
    name: 'Mark',
    email: 'mark@mail.com',
    age: 28,
    address: 'England'
  }
];

所以答案是

[
  {
    "name": "Mark",
    "email": "mark@mail.com",
    "age": 28,
    "address": "England"
  }
]

这绝对没问题,但我的问题是必须为过滤器对象属性值过滤数组
例如,我的过滤器对象将是 {address: 'England', name: ''} 现在这必须过滤 all names and address England 的数组

【问题讨论】:

  • 发布的问题似乎根本没有包含any attempt 来解决问题。 StackOverflow 期待您try to solve your own problem first,因为您的尝试有助于我们更好地了解您想要什么。请编辑问题以显示您尝试过的内容,以说明您在minimal reproducible example 中遇到的特定问题。欲了解更多信息,请参阅How to Ask 并拨打tour
  • users= users.filter(function(item) { for (var key in filter) { if (filter[key]=="") continue; if (item[key] === undefined || item[key] != filter[key]) return false; } return true; });
  • 为什么不在过滤器函数中添加一个条件来检查名称是否真实,并且只应用名称检查是否真实?
  • 感谢@Nadav 添加它并且它有效

标签: javascript arrays filter


【解决方案1】:

您将在用户和每个过滤器对象的条目上使用过滤器

const filter = {address: 'England', name: 'Mark'};

const res = users.filter(user => 
  Object.entries(filter)
  .every(([k,v]) => v === '' || user[k] === v)
);
console.log(res);
<script>
var users = [{
  name: 'John',
  email: 'johnson@mail.com',
  age: 25,
  address: 'USA'
},
  {
    name: 'Tom',
    email: 'tom@mail.com',
    age: 35,
    address: 'England'
  },
  {
    name: 'Mark',
    email: 'mark@mail.com',
    age: 28,
    address: 'England'
  }
];
</script>

【讨论】:

    【解决方案2】:

    从您提到的帖子中的示例中,如果过滤器为空,则继续

    var filter = {address: 'England', name: ''}
    var users = [{
        name: 'John',
        email: 'johnson@mail.com',
        age: 25,
        address: 'USA'
      },
      {
        name: 'Tom',
        email: 'tom@mail.com',
        age: 35,
        address: 'England'
      },
      {
        name: 'Mark',
        email: 'mark@mail.com',
        age: 28,
        address: 'England'
      }
    ];
    
    users = users.filter(function(item) {
      for (var key in filter) {
        if (filter[key] == "") continue; // added this:
        if (item[key] === undefined || item[key] != filter[key])
          return false;
      }
      return true;
    });
    console.log(users)

    【讨论】:

      【解决方案3】:

      您可以使用filterevery 与一些三元逻辑的组合来确定过滤器值是否为空以获得全部。

      var users = [{
          name: 'John',
          email: 'johnson@mail.com',
          age: 25,
          address: 'USA'
        },
        {
          name: 'Tom',
          email: 'tom@mail.com',
          age: 35,
          address: 'England'
        },
        {
          name: 'Mark',
          email: 'mark@mail.com',
          age: 28,
          address: 'England'
        }
      ];
      
      var filter1 = {address: 'England', name: 'Mark'};
      var filter2 = {address: 'England', name: ''};
      
      function findResults(input, filterObj){
         return input.filter(
            item => Object.keys(filterObj)
                          .every(r => filterObj[r].length 
                                         ? item[r] == filterObj[r] 
                                         : true)
         )
      }
      
      console.log('with address and name', findResults(users,filter1));
      console.log('with address only', findResults(users,filter2));

      【讨论】:

        【解决方案4】:

        如果我正确理解您的问题,您需要以下输出。 如果这是您正在寻找的 Array.filter 应该足以满足您的用例。 看看code sandbox,我在其中创建了一个函数 filterByObj,它以 arr、filterObj 作为参数并返回给定的输出 { address: "England", name: "" }

        【讨论】:

          【解决方案5】:

          您需要 filter 处理这种情况。

          var filter1 = {
            address: 'England',
            name: 'Mark'
          };
          
          var filter2 = {
            address: 'England',
            name: ''
          };
          
          var users = [
            {
              name: 'John',
              email: 'johnson@mail.com',
              age: 25,
              address: 'USA'
            },
            {
              name: 'Tom',
              email: 'tom@mail.com',
              age: 35,
              address: 'England'
            },
            {
              name: 'Mark',
              email: 'mark@mail.com',
              age: 28,
              address: 'England'
            }
          ];
          
          function filterUser(arr, obj) {
            return arr.filter(function(item) {
              return (
                (obj.address === '' || item.address === obj.address) &&
                (obj.name === '' || item.name === obj.name)
              );
            });
          }
          
          console.log(filterUser(users, filter1));
          console.log(filterUser(users, filter2));

          【讨论】:

          • 谢谢@mplungjan。现在我了解问题并修改问题答案
          猜你喜欢
          • 2019-12-29
          • 2017-05-28
          • 2017-12-18
          • 1970-01-01
          • 2021-05-24
          • 1970-01-01
          • 2011-09-14
          • 2020-05-30
          • 2017-07-19
          相关资源
          最近更新 更多