代码之家  ›  专栏  ›  技术社区  ›  Nerdragen

确定一个对象是否具有相同的键

  •  0
  • Nerdragen  · 技术社区  · 5 年前

    我想要一个接受操作数组的函数,将其与用户的操作列表进行比较,然后返回用户是否可以执行该操作。

    所以基本上,考虑到:

    const usersActions: { [key: string]: {[key: string]: boolean} } = {
          Bob: { eat: false, drink: false, sleep: true, walk: true },
          Alice: { eat: true, drink: true, sleep: true, walk: false }
    };
    

    enum Actions{
        Eat= 'eat',
        Drink= 'drink',
        Sleep= 'sleep',
        Walk= 'walk'
    }
    
    const verifyActions = (name: string, actions: Array<Actions>) => {
        return actions.every((action) => {
            return usersActions[name][action];
        });
    }
    
    console.log(verifyActions('Bob', [Actions.Eat, Actions.Sleep])); // false
    console.log(verifyActions('Bob', [Actions.Sleep, Actions.Walk])); // true
    console.log(verifyActions('Alice', [Actions.Drink, Actions.Eat, Actions.Sleep])); // true
    console.log(verifyActions('Alice', [Actions.Sleep, Actions.Walk])); // false
    

    这正是我所描述的,但是我忍不住想有更好的方法来做,比如比较数组和对象,或者用Lodash做一行代码?这让我的大脑有点不安,让我觉得有一种更优雅的方法。

    谢谢您!

    1 回复  |  直到 5 年前
        1
  •  2
  •   Ori Drori    5 年前

    return :

    const usersActions = {
      Bob: { eat: false, drink: false, sleep: true, walk: true },
      Alice: { eat: true, drink: true, sleep: true, walk: false }
    };
    
    const Actions = {
      Eat: 'eat',
      Drink: 'drink',
      Sleep: 'sleep',
      Walk: 'walk'
    }
    
    const verifyActions = (name, actions) => actions.every((action) => usersActions[name][action]);
    
    console.log(verifyActions('Bob', [Actions.Eat, Actions.Sleep])); // false
    console.log(verifyActions('Bob', [Actions.Sleep, Actions.Walk])); // true
    console.log(verifyActions('Alice', [Actions.Drink, Actions.Eat, Actions.Sleep])); // true
    console.log(verifyActions('Alice', [Actions.Sleep, Actions.Walk])); // false
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>

    使用lodash,您可以从 userActions[name] 对象,然后检查是否所有 true 使用 _.every() . 然而,这并不能使它更具可读性或更短。

    const usersActions = {
      Bob: { eat: false, drink: false, sleep: true, walk: true },
      Alice: { eat: true, drink: true, sleep: true, walk: false }
    };
    
    const Actions = {
      Eat: 'eat',
      Drink: 'drink',
      Sleep: 'sleep',
      Walk: 'walk'
    }
    
    const verifyActions = (name, actions) => _.every(_.pick(usersActions[name], actions))
    
    console.log(verifyActions('Bob', [Actions.Eat, Actions.Sleep])); // false
    console.log(verifyActions('Bob', [Actions.Sleep, Actions.Walk])); // true
    console.log(verifyActions('Alice', [Actions.Drink, Actions.Eat, Actions.Sleep])); // true
    console.log(verifyActions('Alice', [Actions.Sleep, Actions.Walk])); // false
    <