检查数组是否为数组,但要考虑参数对象

时间:2019-02-07 10:12:22

标签: javascript arrays arguments

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

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

Map Map<Class<T>, Collection<T>>

测试给了我以下信息:

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;
};

非常感谢您提供任何有关此主题的帮助!

1 个答案:

答案 0 :(得分:1)

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

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

请注意,使用的是!==而不是null,以便同时检查undefinedtypeof array === "object"。如果只想遍历对象,则可以使用此检查typeof array[Symbol.iterator] === "function"

最后,我建议使用array.hasOwnProperty('length')而不是length。查看该属性是否真正可以循环使用,而不是检查它是否具有split()属性。 (这是假设您正在使用ES6,因为ES5中不存在符号)