代码之家  ›  专栏  ›  技术社区  ›  Nauman Tanwir

动态筛选器:使用.filter()创建动态筛选器

  •  3
  • Nauman Tanwir  · 技术社区  · 7 年前

    let users = [
        { id: 11, name: 'Adam', age: 23, group: 'editor' },
        { id: 47, name: 'John', age: 28, group: 'admin' },
        { id: 85, name: 'William', age: 34, group: 'editor' },
        { id: 97, name: 'Oliver', age: 28, group: 'admin' }
      ];
    
    var getFilteredUsers = (array, key, value) => array.filter(x => x[key] === value);
    var FilteredUsers = getFilteredUsers(users, "age", 28);
    console.log(FilteredUsers);

    key:value 传入 getgetFilteredUsers()

    马上 getFilteredUsers() equals to . 但是我想用这个函数来比较这三个比较,即等于,小于和大于。

    3 回复  |  直到 7 年前
        1
  •  1
  •   Nina Scholz    7 年前

    你可以拿函数进行比较,然后把想要的函数交出来,或者拿出来 equal 比较作为默认值。

    const
        equal = (a, b) => a === b,
        lt = (a, b) => a < b,
        gt = (a, b) => a > b,
        filter = (array, key, value, cf = equal) => array.filter(x => cf(x[key], value));
    
    var users = [{ id: 11, name: 'Adam', age: 23, group: 'editor' }, { id: 47, name: 'John', age: 28, group: 'admin' }, { id: 85, name: 'William', age: 34, group: 'editor' }, { id: 97, name: 'Oliver', age: 28, group: 'admin' }],
        user28 = filter(users, "age", 28),
        userLT28 = filter(users, "age", 28, lt);
    
    console.log(user28);
    console.log(userLT28);
        2
  •  5
  •   Ele    7 年前

    另一种方法是传递将由函数调用的谓词 filter

    let users = [{ id: 11, name: 'Adam', age: 23, group: 'editor' },{ id: 47, name: 'John', age: 28, group: 'admin' },{ id: 85, name: 'William', age: 34, group: 'editor' },{ id: 97, name: 'Oliver', age: 28, group: 'admin' }];
    let getFilteredUsers = (array, handler) => array.filter(handler);
    
    let  FilteredUsers = getFilteredUsers(users, x => x['age'] === 28);
    console.log(FilteredUsers);
    
    FilteredUsers = getFilteredUsers(users, x => x['age'] > 28);
    console.log(FilteredUsers);
    .as-console-wrapper { max-height: 100% !important; top: 0; }
        3
  •  1
  •   jo_va    7 年前

    您可以使用一个对象来保存您的操作,并为此对象编制索引,以获得适用于该操作的正确函数:

    const users = [
      { id: 11, name: 'Adam', age: 23, group: 'editor' },
      { id: 47, name: 'John', age: 28, group: 'admin' },
      { id: 85, name: 'William', age: 34, group: 'editor' },
      { id: 97, name: 'Oliver', age: 28, group: 'admin' }
    ];
    
    const filterUsers = (arr, key, value, op = 'eq') => {
      const ops = {
        eq: (x, y) => x === y,
        lt: (x, y) => x < y,
        gt: (x, y) => x > y
      };
      return arr.filter(x => ops[op](x[key], value));
    };
    
    console.log(filterUsers(users, 'age', 28));
    console.log(filterUsers(users, 'age', 28, 'lt'));
    console.log(filterUsers(users, 'age', 28, 'gt'));