【问题标题】:Javascript most efficient way to filter array with multiple conditional arguments [duplicate]Javascript最有效的方法来过滤具有多个条件参数的数组[重复]
【发布时间】:2020-12-05 00:31:32
【问题描述】:

我有两个可选参数用于过滤数组。

由于它们是可选的,因此我使用了两个 if 语句,但我很好奇是否有更有效/速记的方式。

// initializing list of users
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'
  }
];


if (args.name){
    users = users.filter(x => x.name == args.name);
}

if (args.address){
    users = users.filter(x => x.address == args.address);
}

return users;

【问题讨论】:

  • "shorthand":这不是已经很短了吗? “高效”:你有时间问题吗?我的意思是,老式的for 循环是最快的,但你为什么要这样做?而且关于性能和风格的问题更适合Code Review
  • 您可以创建一个方法并将参数传递给您要过滤数据的属性。

标签: javascript filter


【解决方案1】:

也许是这样?

if (args.name || args.address){
    users = users.filter(x => x.name == args.name || x.address == args.address);
}

【讨论】:

    【解决方案2】:

    您可以根据需要创建辅助函数,然后在代码中使用它

    const 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'
      }
    ];
    
    // Filter function
    const fltr = (obj, search) => {
      const res = [];
      for(let i = 0; i < obj.length; i++) {
        for(let key in search) {
          let add = true;
          for(let key in search) {
            if(obj[i][key] && obj[i][key] === search[key]) add = true;
            if(!obj[i][key] || obj[i][key] !== search[key]) {
              add = false;
              break;
            }
          }
          if(add) res.push(obj[i]);
        }
      }
      return res;
    }
    
    //
    // Args
    const args = {
      address: "England"
    };
    
    // Use your function in your code, fast and easy
    const res = fltr(users, args);
    
    // Log
    console.log(res);

    【讨论】:

      【解决方案3】:

      您可以将条件组合成一个过滤器语句,只遍历数组一次:

      function filter(args) {
      // initializing list of users
      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'
        }
      ];
      
      
      let conditionals = [];
      
      if (args.name){
          conditionals.push(x => x.name == args.name);
      }
      
      if (args.address){
          conditionals.push(x => x.address == args.address);    
      }
      
      
      return users.filter(x => conditionals.every(c => c(x));
      
      }

      请记住,如果您不处理大量数据,这种优化对现实世界的影响非常小

      【讨论】:

        【解决方案4】:

        您可以使用args 的条目。

        const entries = Object.entries(args);
        
        return users.filter(user => entries.every(([k, v]) => user[k] === v));
        

        【讨论】:

          猜你喜欢
          • 2019-03-02
          • 1970-01-01
          • 2019-11-20
          • 2021-11-20
          • 2021-07-05
          • 2018-11-10
          • 2019-12-29
          • 1970-01-01
          • 2021-01-26
          相关资源
          最近更新 更多