Javascript 对象中包含对象的数组未定义

Javascript 对象中包含对象的数组未定义,javascript,arrays,reactjs,Javascript,Arrays,Reactjs,我有一个包含对象的数组,在对象内部。 我可以对第一个对象和数组进行console.log,但是当我尝试访问数组中的对象或使用数组上的map函数时,会出现一个错误,显示“无法读取未定义的属性” 我已经彻底搜索了SO和其他类似的网站,发现了一些问题,但没有找到适合我的答案 该对象如下所示: { answers: [{…}], createdAt: "2019-01-23T10:50:06.513Z", nested: {kebab: "jjjj", sås: 2, sallad: "

我有一个包含对象的数组,在对象内部。 我可以对第一个对象和数组进行console.log,但是当我尝试访问数组中的对象或使用数组上的map函数时,会出现一个错误,显示“无法读取未定义的属性”

我已经彻底搜索了SO和其他类似的网站,发现了一些问题,但没有找到适合我的答案

该对象如下所示:

{ 
  answers: [{…}],
  createdAt: "2019-01-23T10:50:06.513Z", 
  nested: {kebab: "jjjj", sås: 2, sallad: "kkk"},
  text: "weaxcc",
  /* etc... */
}
我可以使用:
this.state.data

我想访问answers数组中的对象,如:

this.state.data.answers[0].text
甚至:

this.state.data.answers.map().....
但这使我无法读取未定义的属性“0”。答案数组不是空的

感谢您的帮助

编辑 这就是对象在我的状态中结束的方式

getQuestionFromDb = () => {
    axios.get(`http://localhost:3000/questions/${this.state.id}`)
    .then(res => this.setState({
      data: res.data
    }));
  };
此函数在ComponentDidMount()方法中调用

这是我的渲染函数(console.log导致错误):

render(){
返回(
{this.state.data.text}
{console.log(this.state.data.answers[0].text)}
介绍{this.state.id},一位喜欢教授有关{this.state.id}课程的老师

this.setState({message:e.target.value})}> {this.handleAnswerPost(this.state.message)}>Answer ); } }
我们无法在Javascript中访问对象键的原因,通常是因为变量/值不是对象的类型。请确保
此.state.data
类型为Object。您可以尝试
console.log(typeof this.state.data)
。我们应该期望它是输出
对象
。如果类型为
string
,则应首先使用
JSON.parse()

解析该类型。可能有多种原因导致数据对象无法显示:

  • 对象在被调用时未处于状态。这可能是由于异步运算符未加载数据造成的。例如,如果您正在从数据库请求对象,则很可能在调用以检索数据时(
    this.state.data
    ),尚未给出响应

  • 对象可能尚未解析为字符串。尝试运行
    console.log(type of this.state.data)
    。如果输出为
    字符串
    ,则可能需要对其进行解析。如果输出未定义,则第1点有效


当数据在组件的第一次装载时不包含
答案[]
时,这可能不起作用

您可能需要检查阵列是否存在,如下所示:

const { data } = this.state;
data.hasOwnProperty('answers') && console.log(data.answers[0]);

当您的组件成为DOM的一部分时,
componentDidMount
将被调用,但由于XHR,您为填充状态所做的调用是异步的,这可能需要100-300毫秒才能获取组件中的数据,因此
this.state.data.answers
在最初的
render()
周期中不可用

既然您提到使用循环,我建议设置一个初始状态形状,如

this.state = { 
  data: { 
    answers: [] 
  } 
}
初始渲染不会有任何循环,但一旦解析数据并设置新状态,它将正确渲染

或者你可以

return this.state.data.answers.length ? loopItemsHere : <div>Loading..</div>
返回this.state.data.answers.length?loopItemsHere:正在加载。。

显然,
loopitemsher
可以是您为显示答案而编写的任何内容

你能提供准确的目标吗?你能发布完整的代码吗?至少是实际触发错误的代码。需要更多代码。还请说明该对象是如何创建的,以及是否有任何异步操作运行以更改打印
对象的该对象,如果您尝试
console.log(object.keys((this.state.data))
?输出是什么?我们应该期待
[“answer”,“createdAt”,…]
。是的,预期的输出会在控制台中打印出来。不知道“应答”键存在,但在访问时抛出错误
未定义的
。也许您应该将部分代码重新构建到codesandbox.io或jsbin.com。这样人们可以更好地帮助您。或者您可以在通过
this.state.data.answers&&this.state.data.answers.length&&console.log(this.state.data.answers[0])访问它之前执行条件检查
谢谢,这真的很有帮助!但是为什么我可以访问对象的“外部”部分而不是嵌套的“answers”-数组?问题是您的初始状态没有
数据。answers
在其中。这只是解决问题的一种方法。
return this.state.data.answers.length ? loopItemsHere : <div>Loading..</div>