如何在Javascript中获取属性的最后一个元素,如果它不';不存在

如何在Javascript中获取属性的最后一个元素,如果它不';不存在,javascript,Javascript,在线分级器的大多数条件表明测试通过,但如果最后一个属性不存在,则返回undefined(如果不存在,则应返回undefined) 评分员在这种情况下告诉我“TypeError:obj[key]未定义”。也许这很容易,但我不明白我错过了什么。这是我到目前为止所拥有的 函数getLastElementOfProperty(obj,键){ var length=obj[key].length 如果(长度==0){ 返回未定义 } if(!Array.isArray(obj[key])){ 返回未定

在线分级器的大多数条件表明测试通过,但如果最后一个属性不存在,则返回undefined(如果不存在,则应返回undefined)

评分员在这种情况下告诉我“TypeError:obj[key]未定义”。也许这很容易,但我不明白我错过了什么。这是我到目前为止所拥有的

函数getLastElementOfProperty(obj,键){
var length=obj[key].length
如果(长度==0){
返回未定义
} 
if(!Array.isArray(obj[key])){
返回未定义
} 
if(obj[key].length==0){
返回未定义
}
否则{
返回对象[key][length-1]
}

}
如果
obj[key]
不存在,则尝试
obj[key].length是一个错误。在此之前进行一次检查,以发现该情况:

if (typeof obj[key] === "undefined")

如果
obj[key]
不存在,则尝试
obj[key].length
是错误的。在此之前进行一次检查,以发现该情况:

if (typeof obj[key] === "undefined")

obj[key].length在没有此类键时将抛出错误,因为它将转换为
undefined.length

将其更改为以下代码:

if (typeof obj[key] === 'undefined') {
    return undefined;
}

优化您的ifs:

若在if条件段中发现false,解析器将不计算进一步的条件。例如,如果obj[key]==“undefined”
的类型为
i,则不会检查数组.isArray(obj[key])

因此,基本上您的函数可以转换为单线:

 function getLastElementOfProperty(obj, key) {
     return typeof obj[key] !== 'undefined' && Array.isArray(obj[key]) && obj[key].length !== 0
         ? obj[key][length-1]
         : undefined;
 }

obj[key].length在没有此类键时将抛出错误,因为它将转换为
undefined.length

将其更改为以下代码:

if (typeof obj[key] === 'undefined') {
    return undefined;
}

优化您的ifs:

若在if条件段中发现false,解析器将不计算进一步的条件。例如,如果obj[key]==“undefined”
的类型为
i,则不会检查数组.isArray(obj[key])

因此,基本上您的函数可以转换为单线:

 function getLastElementOfProperty(obj, key) {
     return typeof obj[key] !== 'undefined' && Array.isArray(obj[key]) && obj[key].length !== 0
         ? obj[key][length-1]
         : undefined;
 }

修改代码并添加obj[key]验证

function getLastElementOfProperty(obj, key) {
  var returnVal;
  if( obj[key] ){
      var isArray = Array.isArray( obj[key] ),
          length = obj[key].length;
      if( isArray && length ){
        returnVal = obj[key][length - 1];
      }
  }
  return returnVal;
}

修改代码并添加obj[key]验证

function getLastElementOfProperty(obj, key) {
  var returnVal;
  if( obj[key] ){
      var isArray = Array.isArray( obj[key] ),
          length = obj[key].length;
      if( isArray && length ){
        returnVal = obj[key][length - 1];
      }
  }
  return returnVal;
}
您也可以尝试使用

 if (!(key in obj)) return "undefined";
在所有其他检查之前。

您也可以使用

 if (!(key in obj)) return "undefined";

在所有其他检查之前。

最简单的代码使用以下事实:
数组[-1]
未定义的
,没有返回与返回未定义相同

测试
obj&&
,因此如果将null/undefined等作为对象传递,它不会中断

所以只是

function getLastElementOfProperty(obj, key) {
    if (obj && Array.isArray(obj[key])) {
        return obj[key][obj[key].length - 1];
    }
}
您可以将return语句更改为

return obj[key].slice(-1).pop() as well
如果你想成为极简主义者

function getLastElementOfProperty(obj, key) {
    return ((obj && Array.isArray(obj[key]) && obj[key].slice(-1)) || []).pop();
}

最简单的代码使用这样一个事实,即
数组[-1]
未定义的
,并且没有返回与返回未定义相同

测试
obj&&
,因此如果将null/undefined等作为对象传递,它不会中断

所以只是

function getLastElementOfProperty(obj, key) {
    if (obj && Array.isArray(obj[key])) {
        return obj[key][obj[key].length - 1];
    }
}
您可以将return语句更改为

return obj[key].slice(-1).pop() as well
如果你想成为极简主义者

function getLastElementOfProperty(obj, key) {
    return ((obj && Array.isArray(obj[key]) && obj[key].slice(-1)) || []).pop();
}

为什么您首先接收对象长度,然后只检查它是否为数组?这是正确的答案,我将尝试自己解决它以完全获得它。谢谢你,先生,谢谢所有帮助我的人。几分钟后我会接受的,到时候我会接受的。@Justinas-你说得对。让我更新代码。(注意-长度检查可能会格外小心。如果我们使用isArray检查,可能不需要它。)为什么您首先接收对象长度,而只检查它是否为数组?这是正确的答案,我将尝试自己完成它以完全获得它。谢谢你,先生,谢谢所有帮助我的人。几分钟后我会接受的,到时候我会接受的。@Justinas-你说得对。让我更新代码。(注意-长度检查可能非常谨慎。如果我们使用isArray检查,则可能不需要进行长度检查。)