我正在为编码学校做一些练习,其中一个是从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;
};
非常感谢您提供任何有关此主题的帮助!
答案 0 :(得分:1)
问题存在的原因是,在将array
用作null
中的对象之前,您没有检查undefined
是array.hasOwnProperty('length')
还是(array.hasOwnProperty('length'))
。进行如下所示的更改应该可以解决问题。
(array != null && array.hasOwnProperty('length'))
=> !=
请注意,使用的是!==
而不是null
,以便同时检查undefined
和typeof array === "object"
。如果只想遍历对象,则可以使用此检查typeof array[Symbol.iterator] === "function"
。
最后,我建议使用array.hasOwnProperty('length')
而不是length
。查看该属性是否真正可以循环使用,而不是检查它是否具有split()
属性。 (这是假设您正在使用ES6,因为ES5中不存在符号)