如果属性不存在,为什么它不能通过“返回一个空数组”的测试?

Why won't it pass the test that it should "return an empty array if the property does not exist"

本文关键字:一个 数组 测试 返回 为什么 不存在 属性 不能 如果      更新时间:2023-09-26

问题:

给定一个对象和一个键,"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 = [],如果我注释掉这个函数仍然返回相同的东西。如果属性不存在,我该如何返回一个空数组呢?

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

如果被删除,接下来你知道obj[key].length被评估以开始循环。但是如果obj[key]没有length呢?发生错误。

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

您应该使用fail fast return,因此如果键不存在则返回空数组。此外,使用高阶函数,如过滤器,使这个过程更简单。

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');

不使用'key'作为对象中的键名也是一个很好的做法。