如何将嵌套对象转为对象数组 解决map()方法调用报错问题
报错原因
接口返回的是键为数字索引字符串的普通对象,不是JavaScript标准数组类型,没有继承Array.prototype上的map方法,直接调用就会抛出Home.jsx:39 Uncaught TypeError: users.map is not a function错误。
原始接口返回结构如下:
{ "0": { "name": "Rohan" }, "1": { "name": "Meghan" }, "2": { "name": "Rita" } }
转换实现
最简便的实现方式是使用Object.values(),该方法会提取对象所有自有可枚举属性的值,按数字索引的升序返回标准数组,完全匹配你需要的目标结构:
// 此处users为接口返回的原始对象 const arrOfarr = Object.values(users)
如果需要兼容不支持Object.values()的老旧运行环境,可以换用Object.keys()配合map实现,效果完全一致:
const arrOfarr = Object.keys(users).map(indexKey => users[indexKey])
转换后得到的arrOfarr结构和目标要求完全匹配:
[ { "name": "Rohan" }, { "name": "Meghan" }, { "name": "Rita" } ]
注意事项
- 不推荐直接用
for...in循环遍历对象做转换,这种方式会遍历到原型链上的继承属性,容易引入脏数据。上述两种官方API只会提取对象自身的可枚举属性,安全性更高。 - 如果接口存在返回格式不稳定的情况,可以加一层类型判断兜底,避免再次触发类型错误:
const arrOfarr = Array.isArray(users) ? users : Object.values(users)
- 转换完成后就可以正常对
arrOfarr调用map、filter、forEach等所有数组实例方法。
内容的提问来源于stack exchange,提问作者Rohan Routh
相关产品推荐
相关产品推荐

