【问题标题】:Passing an Object in a Function在函数中传递对象
【发布时间】:2023-04-05 14:28:02
【问题描述】:

我正在做一个 freecodecamp 挑战,我被要求完成一个函数,如果传递的对象包含所有四个名称,则返回 true:“Alan”“Jeff”“Ryan”“Sarah”。 前面定义了一个对象,包含数据:

let users = {
    Alan: {
      age: 27,
      online: true
    },
    Jeff: {
      age: 32,
      online: true
    },

等等。 函数是这样开始的

function isEveryoneHere(userObj) {}

我把这个写成我完成的函数,我可以在其中返回所有 4 个名字:

for (const property in userObj) {
  if (userObj) {
    return userObj.hasOwnProperty(property)
  }

但我仍然被告知我没有达到挑战的标准。有什么建议或建议吗?

编辑:错误消息不应直接访问用户对象

通过 用户对象应该只包含键 Alan、Jeff、 莎拉和瑞恩

通过 如果 Alan、Jeff、 Sarah 和 Ryan 是传递给它的对象的属性。

如果 Alan 不是 alan,函数 isEveryoneHere 应该返回 false 传递给它的对象的属性。

如果 Jeff 不是 传递给它的对象的属性。

如果 Sarah 不是,函数 isEveryoneHere 应该返回 false 传递给它的对象的属性。

如果 Ryan 不是 传递给它的对象的属性

编辑:

他们就是这样解决的

function isEveryoneHere(userObj) {
  if (
    userObj.hasOwnProperty("Alan") &&
    userObj.hasOwnProperty("Jeff") &&
    userObj.hasOwnProperty("Sarah") &&
    userObj.hasOwnProperty("Ryan")
  ) {
    return true;
  }
  return false;
}

【问题讨论】:

  • 您能否添加说明您不符合条件的错误消息?
  • @PaulinaKhew 它可能是一个/多个正在测试的测试对象不返回正确的结果。通常它不会告诉你它在函数上尝试了哪些数据以避免作弊;)
  • 已添加对此感到抱歉。我认为它希望我在 if 语句的参数中添加一个布尔值。但是,我最初尝试写一个 if 语句说: if (userObj) { userObj.hasOwnProperty('online')} 和其他没有让我通过的尝试,所以我尝试做一个 for...in 语句和一个在对我可以提供的解决方案进行一些研究之后使用 if 语句。
  • 错误消息说您不应该直接访问对象...在您调用的函数中:userObj.hasOwnProperty(property)。直接调用对象内的函数。尝试使用 var keyArray = Object.keys(userObj); 从对象中提取键然后检查键 Array 是否只有列出的名称并且没有丢失任何名称
  • const keys = Object.keys(users); const all_here = ['Alan', 'Jeff', 'Sarah', 'Ryan'].every(el => keys.includes(el)); 这有帮助吗?

标签: javascript function object


【解决方案1】:

我可能会做类似的事情

let users = {
    Alan: {
      age: 27,
      online: true
    },
    Jeff: {
      age: 32,
      online: true
    },
}

function check(userObj) {
  return ['Alan', 'Jeff', 'Ryan', 'Sarah'].every(user => userObj.hasOwnProperty(user));
}

function check2(userObj) {
  return ['Alan', 'Jeff', 'Ryan', 'Sarah'].every(user => Object.keys(userObj).includes(user));
}

console.log('check: ' + check({ Jeff: 1, Alan: 2, Ryan: 3, Sarah: 4 }));
console.log('check2: ' + check2({ Jeff: 1, Alan: 2, Ryan: 3, Sarah: 4 }));
console.log('Should fail (check): ' + check(users));
console.log('Should fail (check2): ' + check2(users));

这两种变体都应满足所有条件 - 除了不应直接访问对象的条件。我不确定他们的意思,但第二个将键转换为数组,所以也许这就是他们正在寻找的,即使它效率低下。

【讨论】:

  • 这不满足答案。 “不应直接访问对象”是什么意思,它们意味着我可以在我的函数中使用“用户”,我必须使用 userObj。
  • 哦,哇,好吧……那很容易。我编辑了代码 sn-p 以反映这一点,只需将用户对象传递给任何函数;-)
【解决方案2】:

规范将includes 函数描述为线性搜索。因此,当您在任何循环中使用它时,它会将其最坏情况的时间复杂度增加到n * 2。如果您需要检查名称是否存在,那么您可以在此处使用Set,它针对存在检查进行了优化。

要优化解决方案,您可以在此处使用Set

let users = {
  Alan: {
    age: 27,
    online: true
  },
  Jeff: {
    age: 32,
    online: true
  },
  Sarah: {
    age: 48,
    online: true
  },
  Ryan: {
    age: 19,
    online: true
  }
};

function isEveryoneHere(userObj) {
  const nameDict = ['Alan', 'Jeff', 'Sarah', 'Ryan'];
  const keys = new Set(Object.keys(userObj));
  return nameDict.every(name => keys.has(name))
}

console.log(isEveryoneHere(users));

【讨论】:

  • 这给了我正确的答案,但我没有使用它要求我使用的任何命令。不管怎样,谢谢你
【解决方案3】:

let users = {
  Alan: {
    age: 27,
    online: true
  },
  Jeff: {
    age: 32,
    online: true
  },
  Ryan: {
    age: 27,
    online: true
  },
  Sarah: {
    age: 32,
    online: true
  },
};
const myProps = ['Alan', 'Jeff', 'Sarah', 'Ryan'];

function isEveryoneHere(userObj, expectedProps) {
    return expectedProps.every(el => Object.keys(userObj).includes(el));
}

console.log(isEveryoneHere(users, myProps))

将此作为答案与评论发布。

【讨论】:

    【解决方案4】:

    我通过链接运行了这个,它通过了

    let users = {
      Alan: {
        age: 27,
        online: true
      },
      Jeff: {
        age: 32,
        online: true
      },
      Sarah: {
        age: 48,
        online: true
      },
      Ryan: {
        age: 19,
        online: true
      }
    };
    
    function isEveryoneHere(userObj) {
      const names = ['Alan', 'Jeff', 'Ryan', 'Sarah'];
      const keys = Object.keys(userObj);
      for (let name in names) {
        if (!(name in keys)) {
          return false;
        }
      }
      return true;
    }
    
    console.log(isEveryoneHere(users));
    

    它遍历names 中的每个名称,并检查users 对象是否包含与该名称等效的键。如果任何名称不在keys 中,则返回false。否则返回true

    【讨论】:

    • 返回 true 但不满足要求。 freecodecamp.org/learn/…
    • @goldwind1111 对其进行了编辑,并给出了通过的答案:)
    • 干得好 :) 也感谢您的帮助。我要加你为好友。我总是有很多问题大声笑:))
    猜你喜欢
    • 2012-10-20
    • 1970-01-01
    • 2020-05-24
    • 2014-10-24
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多