将带键名对象内容推入数组时push返回undefined,求排查方案
问题分析与解决方案
你遇到的问题核心是遍历对象的方式不对——你的原始数据是一个以用户ID为键名的普通对象,不是数组,所以用普通数组式的for循环遍历,自然拿不到对应的用户数据,push进去的就都是undefined了。
下面给你两种简单的解决方法,直接就能得到你想要的userArray:
方法一:用Object.values()直接提取(推荐,ES6+)
这是最简洁的方式,Object.values()会直接返回对象所有属性值组成的数组,一步到位:
// 你的原始对象 const userObj = { "1293818383": { "xp": 200, "level": 3, "name": "User 1" }, "235489445527289867": { "xp": 300, "level": 1, "name": "User 2" }, "123189273132": { "xp": 100, "level": 3, "name": "User 3" } }; // 直接转换为目标数组 const userArray = Object.values(userObj); console.log(userArray); // 输出:[{"xp":200,"level":3,"name":"User 1"},{"xp":300,"level":1,"name":"User 2"},{"xp":100,"level":3,"name":"User 3"}]
方法二:用for...in循环遍历(兼容旧环境)
如果你的运行环境不支持ES6语法,可以用for...in遍历对象的键名,再通过键名获取对应的用户对象:
const userObj = { "1293818383": { "xp": 200, "level": 3, "name": "User 1" }, "235489445527289867": { "xp": 300, "level": 1, "name": "User 2" }, "123189273132": { "xp": 100, "level": 3, "name": "User 3" } }; const userArray = []; for (const userId in userObj) { // 加上hasOwnProperty判断,避免遍历到原型链上的属性 if (userObj.hasOwnProperty(userId)) { userArray.push(userObj[userId]); } } console.log(userArray);
为什么你之前的代码会得到undefined?
你之前的for循环应该是像遍历数组那样写的(比如for (let i=0; i<xxx.length; i++)),但你的原始数据是对象,没有数组的length属性,循环过程中根本没拿到有效的用户对象,所以push(i)进去的自然都是undefined啦。
内容的提问来源于stack exchange,提问作者ethanc
相关产品推荐
相关产品推荐

