Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问javascript数组元素时出错,尽管进行了检查_Javascript_Arrays_Javascript Objects - Fatal编程技术网

访问javascript数组元素时出错,尽管进行了检查

访问javascript数组元素时出错,尽管进行了检查,javascript,arrays,javascript-objects,Javascript,Arrays,Javascript Objects,我在javascript代码中执行以下操作 if( typeof player['stats'] != undefined && typeof player['stats']['guild'] != undefined && typeof player['stats']['guild']['master'] != undefined && typeof player['stats']['guild']['master']['sinc

我在javascript代码中执行以下操作

if(
  typeof player['stats'] != undefined &&
  typeof player['stats']['guild'] != undefined &&
  typeof player['stats']['guild']['master'] != undefined &&
  typeof player['stats']['guild']['master']['since'] != undefined
)
但是我得到了一个错误:

无法读取null的属性'since'


我已经被这件事困扰了一段时间了。任何javascript大师都能帮我吗?

类型的返回字符串,请与“未定义”进行比较


typeof返回字符串,因此请与“未定义”进行比较


只需检查该值是否真实:

if(
  player['stats'] &&
  player['stats']['guild'] &&
  player['stats']['guild']['master'] &&
  player['stats']['guild']['master']['since'] != undefined    // only check the last one as it is probably not an object but another value such as 0 (depending on what your data looks like, if you have it as an object then just remove the != undefined check)
)

只需检查该值是否真实:

if(
  player['stats'] &&
  player['stats']['guild'] &&
  player['stats']['guild']['master'] &&
  player['stats']['guild']['master']['since'] != undefined    // only check the last one as it is probably not an object but another value such as 0 (depending on what your data looks like, if you have it as an object then just remove the != undefined check)
)

您可以编写一个相当简单的对象getter函数,传递对象,然后传递一个点分隔键以查找如下值:

function getObj(obj, key) {
  return key.split(".").reduce((acc, cur) => {
    if (acc !== undefined) {
      return acc[cur];
    }
    return acc;
  }, obj);
}
然后,您可以获取所需的值,并查看它是否未定义:

const player = {
  stats: {
    guild: {
      master: {
        since: '2004'
      }
    }
  }
};

const since = getObj(player, 'stats.guild.master.since');
if (since) {
  // do some code
}

这是一个方便的实用函数,可以在任何对象上使用,并使if语句更漂亮。

您可以编写一个相当简单的对象getter函数,通过该函数传递对象,然后通过点分隔键来查找如下值:

function getObj(obj, key) {
  return key.split(".").reduce((acc, cur) => {
    if (acc !== undefined) {
      return acc[cur];
    }
    return acc;
  }, obj);
}
然后,您可以获取所需的值,并查看它是否未定义:

const player = {
  stats: {
    guild: {
      master: {
        since: '2004'
      }
    }
  }
};

const since = getObj(player, 'stats.guild.master.since');
if (since) {
  // do some code
}

这是一个方便的实用函数,可用于任何对象,并使if语句更加美观。

您还可以使用临时变量避免多次查找:

player={stats:{guild:{master:null}}
如果((临时=玩家统计数据)和
(临时工=临时工协会)和
(温度=主温度)和
(临时=临时自)!==未定义)
console.log(true,temp)
其他的
console.log(假,临时)
player.stats.guild.master={自:“今天”起}
如果((临时=玩家统计数据)和
(临时工=临时工协会)和
(温度=主温度)和
(临时=临时自)!==未定义)
console.log(true,temp)
其他的

console.log(false,temp)
您还可以使用临时变量避免多次查找:

player={stats:{guild:{master:null}}
如果((临时=玩家统计数据)和
(临时工=临时工协会)和
(温度=主温度)和
(临时=临时自)!==未定义)
console.log(true,temp)
其他的
console.log(假,临时)
player.stats.guild.master={自:“今天”起}
如果((临时=玩家统计数据)和
(临时工=临时工协会)和
(温度=主温度)和
(临时=临时自)!==未定义)
console.log(true,temp)
其他的


console.log(false,temp)
删除
类型和
!=未定义的
部分。使用
lodash#get
来简化这个可怕的构造。@ibrahimmahrir这没有帮助:(更新:没有看到您的编辑,让我试试。)again@ibrahimmahrir-成功了!你应该把它作为答案发布,这样我就可以接受,其他人也可以从中受益!删除
类型的
!=未定义的
部分的可能副本。使用
lodash#get
来简化这个可怕的结构。@ibrahimmahrir,没有帮助:(更新:没有看到您的编辑,让我试试again@ibrahimmahrir-成功了!你应该把它作为答案发布,这样我可以接受,其他人也可以从中受益!如果玩家['stats']['guild']['master']
is
null
not
undefined
(从错误中推断)@ibrahimmahrir yes遗漏了这一点,它也需要比较null,代码已更正,谢谢pointing@UndefinedVariable现在检查仍然不能解决问题,因为
玩家['stats']['guild']['master']
空的
不是
未定义的
(从错误中推断)..@ibrahimmahrir yes遗漏了这一点,它也需要比较null,代码已更正,谢谢pointing@UndefinedVariable现在检查
玩家['stats']['guild']['master']['since']
有错误值(false,0,”)时该怎么办?@alexmac它主要是一个对象,他将在
if
的主体内使用。但我添加了一个检查,以防万一。如果
player['stats']['guild']['master']['since']
有错误值(false,0,“”),该怎么办?@alexmac它主要是一个对象,他将在
if
的主体中使用。但我添加了一个复选框以防万一。我认为只有删除“!==undefined`并将其添加到if语句
if(因为!==undefined)中,这才有效
因为在他的情况下,master是
null
更新的,所以它可以优雅地处理null和未定义的:我认为只有当您删除“!==undefined`并将其添加到if语句
if(因为!==undefined)
中,它才能优雅地处理null和未定义的内容。
因为在他的情况下,master是
null
更新的,所以它可以优雅地处理null和未定义的内容: