【问题标题】:Checking whether array is array, but taking into account arguments object检查数组是否是数组,但要考虑参数对象
【发布时间】:2019-07-01 10:15:51
【问题描述】:

我正在为一所编码学校做一些练习,其中一个是从 Underline 重新实现 _.first。我的代码没有通过最后一个测试,即“如果数组不是数组,则应返回一个空数组”,这看起来应该很容易。

但是,还有另一个测试是“应该在参数对象上工作”,如果我通过了第二个测试,我无法通过第一个测试,并且我想不出任何其他实现 atm。 这是我对这两个测试的代码:

function (array, n) {
  let resultingArray = [];
  let args = Array.prototype.slice.call(arguments, 0, 1);
  let args2 = args[0];
  if (!Array.isArray(array)) {
    if (array.hasOwnProperty('length')) {
        for (let key in args2) {
          if (args2[key] == 'a' || args2[key] == 'b') {
            resultingArray.push(args2[key]);
          }
        }
    } else {
      resultingArray = [];
    }
  } else if (array == undefined) {
    resultingArray = [];
  } else if (n == undefined || n <= 0) {
    resultingArray = array.slice(0, 1);
  } else {
    resultingArray = array.slice(0, n);
  }
  return resultingArray;
};

测试给了我以下信息:

should return an empty array if array is not an array ‣
TypeError: Cannot read property 'hasOwnProperty' of undefined
    at Object._.first (index.js:14:15)
    at Context.<anonymous> (test/test.js:34:9)_.first().should.eql([]);
_.first(null).should.eql([]);
_.first(1).should.eql([]);

在此先感谢您的帮助!

【问题讨论】:

  • [].hasOwnProperty('length');true
  • "if (!Array.isArray(array))" 没有意义
  • argsargs2 是怎么回事? AFAICS,args2 === array.
  • 你的功能完成了吗?因为它也缺少右大括号和 return 语句。
  • @oniramarf 不完整,我将更新以包含所有代码

标签: javascript arrays arguments


【解决方案1】:

问题存在的原因是因为在将array 用作array.hasOwnProperty('length') 中的对象之前,您没有检查它是null 还是undefined。进行如下所示的更改应该可以解决问题。

(array.hasOwnProperty('length')) => (array != null &amp;&amp; array.hasOwnProperty('length'))

请注意,使用!= 而不是!==,这样nullundefined 都会被检查。如果你只想循环一个对象,那么你可以改用这个检查typeof array === "object"

最后,我建议使用typeof array[Symbol.iterator] === "function" 而不是array.hasOwnProperty('length')。查看该属性是否实际上可以循环,而不是检查它是否具有length 属性。 (这是假设您使用的是 ES6,因为 ES5 中不存在符号)

【讨论】:

  • 我无法定义数组或 n,因为它由外部工作表 test.js 定义,如此处所示 TypeError: Cannot read property 'hasOwnProperty' of undefined at Object._.first (index.js:14:15) at Context.&lt;anonymous&gt; (test/test.js:34:9) 至于将 if (!Array.isArray(array)) 更改为 if (Array.isArray(array)) 我还有其他测试要通过相关到数组并且我的代码通过了它,我在这两个测试中遇到了问题,它们都涉及数组以外的其他元素(参数或对象或原语)
  • 那把if (array.hasOwnProperty('length')) {改成if (typeof array !== "undefined" &amp;&amp; array.hasOwnProperty('length')) {怎么样?
  • 另外,我已经编辑了答案。你能这样定义arrayn吗?
  • 不,我根本无法触摸数组或 n。我已经检查了 typeof array !== 'undefined' 并且它可以工作,但是测试随后会引发错误,因为它 cannot read 'hasOwnProperty' of null 要么,我将尝试按照您的方式进行,并会回复您
  • 我决定重新排列条件的顺序,然后使用您的逻辑添加!== undefined, !== null and typeof array !== 'number',是的,它现在通过了所有测试!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多