如果属性不存在,为什么它不能通过“返回一个空数组”的测试?
Why won't it pass the test that it should "return an empty array if the property does not exist"
问题:
给定一个对象和一个键,"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'作为对象中的键名也是一个很好的做法。
相关文章:
- Javascript(Angular)从一个对象数组到第二个数组查找值
- 根据id将json数组组合为一个json数组
- JavaScript数组包含一个值
- 对一个对象使用reduce可以返回一个没有't在数组中包含目标字母
- jQuery$.inArray()总是返回-1和一个对象数组
- 在数组中的一个元素上设置多个值
- javascript处理一个对象数组以获得一个新的对象数组
- 作为一个二维数组,从ajax接收
- 你能用来自数组的属性名称生成一个对象吗
- 多维关联数组的最后一个索引
- 如何创建一个方法来验证数组的范围
- 循环以检查数组中的最后一个图像
- 在Javascript中将一个值和字符串数组转换为if语句
- 算法:从数组(javascript/angular)中按当前日期获取上一个和下一个事件
- 如何将一个对象添加到每个对象数组中
- 如何创建一个谷歌地图地理坐标数组
- 如何从另一个带下划线的数组中筛选带元素的数组
- 如何在PHP数组中加载下一个youtube
- 查找对象数组是否包含其中一个标记的最快方法
- 如何使用Javascript和Ajax传递一个HTML选择标签到PHP $_POST与一个(数组)var当名称属性是一个