为何retQuestions会变成二维数组?JavaScript数组处理问题咨询
问题分析与解决:为什么map返回二维数组?
原因拆解
你遇到的问题核心是对Object.values()的返回值理解有误。咱们看你的原始数据结构:
const questions = { iq_test: { questions: [ /* 你的试题数组 */ ] } }
questions.iq_test是一个对象,它只有一个属性questions,对应的值才是你要的一维试题数组。当你调用Object.values(questions.iq_test)时,这个方法会把对象里所有属性的值提取出来,打包成一个新数组——这里因为只有questions这一个属性,所以返回的是[ [题1, 题2, 题3] ],也就是一个包含一维数组的数组(二维数组的雏形)。
接着你对这个结果调用map,map会遍历外层数组的每一项(这里只有一项,就是那个一维试题数组),然后把每一项原封不动返回,最终得到的自然是[ [题1, 题2, 题3] ]这种二维数组格式。
解决方法
有两种简单的方式可以解决这个问题:
方法1:直接访问目标属性(推荐)
既然你明确知道要的是iq_test下的questions数组,完全不需要绕弯子用Object.values,直接取值即可:
let retQuestions = questions.iq_test.questions; // 现在retQuestions就是你要的一维数组,可以直接map遍历 retQuestions.map(item => { console.log(item); return item; });
方法2:处理Object.values的返回结果(适用于不确定属性名的场景)
如果因为某些原因必须用Object.values,可以通过以下两种方式把二维数组转成一维:
- 取数组的第一个元素:
let retQuestions = Object.values(questions.iq_test)[0];
- 用
flat()方法展平数组:
let retQuestions = Object.values(questions.iq_test).flat().map(item => { console.log(item); return item; });
这样处理后,retQuestions就会是你预期的一维试题数组,后续的map遍历也能正常获取单个试题了。
内容的提问来源于stack exchange,提问作者JEEZSUSCRIZE
相关产品推荐
相关产品推荐

