Javascript 当对象属性不存在时返回值';不存在

Javascript 当对象属性不存在时返回值';不存在,javascript,arrays,object,Javascript,Arrays,Object,在我的代码上运行测试。如果传入函数的属性不存在,则应返回0。但它什么也不退。我打错了吗 var obj = { key: [1, 2, 3] }; function getAverageOfElementsAtProperty(obj, key) { if (obj[key].length === 0 || Array.isArray(obj[key]) === false || obj.hasOwnProperty(key) === false) { return 0;

在我的代码上运行测试。如果传入函数的属性不存在,则应返回0。但它什么也不退。我打错了吗

var obj = {
  key: [1, 2, 3]
};

function getAverageOfElementsAtProperty(obj, key) {
  if (obj[key].length === 0 || Array.isArray(obj[key]) === false || obj.hasOwnProperty(key) === false) {
    return 0;
  }
  var average = 0;
  for (var i = 0; i < obj[key].length; i++) {
    average += obj[key][i];
  }
  average /= obj[key].length;
  return average;
}

console.log(getAverageOfElementsAtProperty(obj, 'notKey'));
var obj={
键:[1,2,3]
};
函数getAverageOfElementsAtProperty(对象,键){
if(obj[key].length==0 | | | Array.isArray(obj[key])==false | | | obj.hasOwnProperty(key)==false){
返回0;
}
var平均值=0;
对于(变量i=0;i
如果不将数组传递给函数,当它尝试获取传递的对象的
长度时会失败,因此最初的测试不应该是这样的。您只需查看该属性是否存在,只需在
if
条件下尝试访问该属性即可

现在,如果要添加测试以查看该属性是否存在以及它是否为数组,则必须添加更多测试以检查数组中的项是否为数字,否则尝试获取数字平均值将失败

因为实际上有两件事要做(检查属性是否存在并获得数学平均值),我将把它分成两个函数:

var obj1={
键:[1,2,3]
};
变量obj2={
键:[1,“测试”,3]
};
函数getAverageOfElementsAtProperty(对象,键){
if(obj[key]&&Array.isArray(obj[key]){
//好的,我们有正确的属性,那里有一个数组,
//现在我们必须测试数组中的每个项都是一个数字
var numbers=obj[key]。每个(函数(currentValue){
返回currentValue的类型==“number”;
});
//如果有所有数字,则返回平均值;如果没有,则返回0
返回数字?getAverage(obj[键]):0;
}否则{
返回0;
}
}
函数getAverage(arr){
var平均值=0;
//forEach()比循环计数简单得多
arr.forEach(功能(项目){
平均+=项目;
});
返回平均/arr.length;
}
log(getAverageOfElementsAtProperty(obj1,'notkey'));//0
log(getAverageOfElementsAtProperty(obj1,'key'));//2.

log(getAverageOfElementsAtProperty(obj2,'key'));//0-obj2不包含所有数字
如果未将数组传递给函数,则当它尝试获取所传递对象的
长度
时会失败,因此最初的测试方式不应该是这样。您只需查看该属性是否存在,只需在
if
条件下尝试访问该属性即可

现在,如果要添加测试以查看该属性是否存在以及它是否为数组,则必须添加更多测试以检查数组中的项是否为数字,否则尝试获取数字平均值将失败

因为实际上有两件事要做(检查属性是否存在并获得数学平均值),我将把它分成两个函数:

var obj1={
键:[1,2,3]
};
变量obj2={
键:[1,“测试”,3]
};
函数getAverageOfElementsAtProperty(对象,键){
if(obj[key]&&Array.isArray(obj[key]){
//好的,我们有正确的属性,那里有一个数组,
//现在我们必须测试数组中的每个项都是一个数字
var numbers=obj[key]。每个(函数(currentValue){
返回currentValue的类型==“number”;
});
//如果有所有数字,则返回平均值;如果没有,则返回0
返回数字?getAverage(obj[键]):0;
}否则{
返回0;
}
}
函数getAverage(arr){
var平均值=0;
//forEach()比循环计数简单得多
arr.forEach(功能(项目){
平均+=项目;
});
返回平均/arr.length;
}
log(getAverageOfElementsAtProperty(obj1,'notkey'));//0
log(getAverageOfElementsAtProperty(obj1,'key'));//2.

log(getAverageOfElementsAtProperty(obj2,'key'));//0-obj2不包含所有数字
,因为obj['notKey']
不存在,所以它不会返回数组。因此,您不能对未定义的
.length
。我会把它改成
typeof
,看看它是否定义了

var obj = {
  key: [1, 2, 3]
};

function getAverageOfElementsAtProperty(obj, key) {

  if (typeof obj[key] == 'undefined' || Array.isArray(obj[key]) === false || obj.hasOwnProperty(key) === false) {
    return 0;
  }

  var average = 0;
  for (var i = 0; i < obj[key].length; i++) {
    average += obj[key][i];
  }
  average /= obj[key].length;
  return average;
}

console.log(getAverageOfElementsAtProperty(obj, 'notKey'));
var obj={
键:[1,2,3]
};
函数getAverageOfElementsAtProperty(对象,键){
如果(对象的类型[键]='undefined'| | | Array.isArray(对象[键])===false | | |对象的属性(键)==false){
返回0;
}
var平均值=0;
对于(变量i=0;i
由于obj['notKey']不存在,因此它不会返回数组。因此,您不能对未定义的
.length
。我会把它改成
typeof
,看看它是否定义了

var obj = {
  key: [1, 2, 3]
};

function getAverageOfElementsAtProperty(obj, key) {

  if (typeof obj[key] == 'undefined' || Array.isArray(obj[key]) === false || obj.hasOwnProperty(key) === false) {
    return 0;
  }

  var average = 0;
  for (var i = 0; i < obj[key].length; i++) {
    average += obj[key][i];
  }
  average /= obj[key].length;
  return average;
}

console.log(getAverageOfElementsAtProperty(obj, 'notKey'));
var obj={
键:[1,2,3]
};
函数getAverageOfElementsAtProperty(对象,键){
如果(对象的类型[键]='undefined'| | | Array.isArray(对象[键])===false | | |对象的属性(键)==false){
返回0;
}
var平均值=0;
对于(变量i=0;i
也许您应该在函数中捕获运行时错误(至少暂时如此)。即使使用匹配的密钥,也可能出现零除错误吗?(另外,不要对条件语句中的===发狂)。检查的顺序正好相反
hasOwnProperty
应该是第一个,然后是
isArray
和length也许您应该在函数中捕获运行时错误(至少暂时)。即使使用匹配的密钥,也可能出现零除错误吗?(另外,不要对条件语句中的===发狂)。检查的顺序正好相反<代码>hasOwnProperty