【问题标题】:Why won't it pass the test that it should "return an empty array if the property does not exist"为什么它不能通过它应该“如果属性不存在则返回一个空数组”的测试
【发布时间】:2017-03-13 00:42:02
【问题描述】:

问题:

给定一个对象和一个键,“getEvenElementsAtProperty”返回一个数组,其中包含位于给定键的数组的所有偶数元素。

注意事项:

  • 如果数组为空,它应该返回一个空数组。
  • 如果数组不包含偶数元素,它应该返回一个空数组。
  • 如果给定键的属性不是数组,它应该返回一个空数组。
  • 如果给定键没有属性,它应该返回一个空数组。

我的代码:

 var obj = {
 key: [1000, 11, 50, 17]
 }; // sample object


    function getEvenElementsAtProperty(obj, key) {
      var arr = []
      if (!obj[key]) arr = [] 
      if (!obj[key] % 2=== 0) arr = []
      for (var i = 0; i < obj[key].length; i++){
          if (obj[key][i] % 2 === 0) arr.push(obj[key][i])
      } 
      return arr;
      }
    getEvenElementsAtProperty(obj, 'key') // [1000, 50], yet still doesn't pass

问题:

为什么我仍然收到错误说如果属性不存在,它不会返回空数组?我认为这是由第 3 行完成的:if (!obj[key]) arr = [],如果我将其注释掉,该函数仍会返回相同的内容。这是怎么回事,如果属性不存在,我如何返回一个空数组。

【问题讨论】:

  • 尝试使用浏览器的调试器并跟踪代码。使用手表或控制台检查obj[key]!obj[key]!obj[key] %2等的值...您可以通过在函数开头添加debugger;命令来闯入调试器(并运行代码浏览器的开发者工具面板打开)。

标签: javascript arrays properties


【解决方案1】:

您将arr 初始化为一个空数组,然后有条件地再执行两次相同的操作。应该清楚的是,这些条件永远不会改变函数的行为,因此可以在不改变函数行为的情况下移除它们。

如果删除,则评估您知道的下一件事 obj[key].length 以启动循环。但是如果obj[key] 没有length 怎么办?发生错误。

如果循环工作的任何必要条件不成立,您应该立即做return []。顺便说一句,那些条件是#3和#4;正确编写的循环将“免费”处理 #1 和 #2。

【讨论】:

    【解决方案2】:

    您应该使用快速失败返回,因此如果键不存在,则返回一个空数组。此外,使用 filter 之类的高阶函数可以让这个过程变得更加简单。

    var object = {
      moreDescriptiveKeyName: [1000, 11, 50, 17]
    };
    
    function getEvenElementsAtProperty(obj, key) {
      if (!obj[key]) return []; 
      // var arr = [];
      // for (var i = 0; i < obj[key].length; i++){
      //     if (obj[key][i] % 2 === 0) arr.push(obj[key][i])
      // } 
      // return arr;
      return obj[key].filter(function(el, i) {
        return i % 2 === 0
      });
     }
     getEvenElementsAtProperty(object, 'moreDescriptiveKeyName');
    

    最好不要在对象中使用“键”作为键名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 2019-04-12
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 2017-04-11
      相关资源
      最近更新 更多