Javascript 对象中包含对象的数组未定义
我有一个包含对象的数组,在对象内部。 我可以对第一个对象和数组进行console.log,但是当我尝试访问数组中的对象或使用数组上的map函数时,会出现一个错误,显示“无法读取未定义的属性” 我已经彻底搜索了SO和其他类似的网站,发现了一些问题,但没有找到适合我的答案 该对象如下所示: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: "
{
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>