为什么函数返回的是undefined而不是给定的元素?

时间:2019-11-23 20:08:04

标签: javascript arrays function for-loop

我正在尝试解决以下问题。我已经测试过,并且所有下面的条件都应返回到位于给定键处的数组的第n个元素。该函数返回undefined而不是第n个元素。我不是在寻找答案,而是为什么它返回未定义。

编写一个名为“ getNthElementOfProperty”的函数。

给出一个对象和一个键,“ getNthElementOfProperty”返回位于给定键处的数组的第n个元素。

注意:

如果数组为空,则应返回undefined。 如果n超出范围,则应返回undefined。 如果给定键处的属性不是数组,则应返回undefined。 如果键上没有属性,则应返回undefined。 样本数据:

var obj = {
  key: [1, 2, 6]
};
var output = getNthElementOfProperty(obj, 'key', 1);
console.log(output); // --> 2

function getNthElementOfProperty(obj, key, n) {
  if(obj[key] === undefined){
    return undefined
  } else if(Array.isArray(obj[key]) === false){
    return undefined
  // otherwise if array empty
  } else if(obj[key].length === 0){
    return undefined
  }
  for(var e in obj[key]){
    if(e === n){
      return obj[key][e];
    } 
  }
  return undefined;
}

3 个答案:

答案 0 :(得分:2)

只需删除循环。如果索引不在数组内,则JavaScript返回undefined。您也可以摆脱if (array.length === 0),因为索引不能在长度为0的数组内。

function getNthElementOfProperty(obj, key, n) {
  if(obj[key] === undefined){
    return undefined
  } else if(Array.isArray(obj[key]) === false){
    return undefined
  }   
  return obj[key][n];
}

如果您想知道循环为什么不起作用:

for (let i in array)将索引作为字符串分配给i===运算符检查类型,例如查看'0' !== 0

答案 1 :(得分:0)

结果是,我需要使用常规的for循环,而不是for循环。

*********Menu*********
1) - The biggest number : 
9) - Exit :
Enter your choice please : 1
Option 1 :
The biggest number is  => 89
*********Menu*********
1) - The biggest number : 
9) - Exit :
Enter your choice please : 

答案 2 :(得分:0)

具有所有验证功能的简单函数,无需循环,可以使用hasOwnProperty代替obj[key] === undefined

function getNthElementOfProperty(obj, key, n) {
    //validate obj and key and n
    if (!obj || !key || isNaN(n)) {
        return undefined;
        // if key in not in Object
    } else if (!obj.hasOwnProperty(key)) {
        return undefined;
        // if property at key is not a array
    } else if (!Array.isArray(obj[key])) {
        return undefined;
        // if array is empty
    } else if (!obj[key].length) {
        return undefined;
        // if n is greater than Array length 
    } else if (obj[key].length < n) {
        return undefined;
    } else {
        return obj[key][n]
    };
};