如何不使用Object.values()获取对象值?已实现无Object.keys()取键
不使用Object.values()获取对象值的解决方案
方法一:基于你熟悉的for...in循环修改
你之前写的获取键名的逻辑很清晰,要获取值其实只需要在循环里通过键名访问对象的对应属性即可,不需要直接替换循环变量名:
function values(json) { var obj = JSON.parse(json); let result = []; for (const key in obj) { // 通过obj[key]拿到当前键对应的value,再推入结果数组 result.push(obj[key]); } return result; }
你之前直接把key换成value没用,是因为for...in循环遍历的本来就是对象的键名,循环变量存的是键,要拿到值必须用对象[键名]的方式来访问。
方法二:正确使用map函数
你尝试用map的思路没问题,但代码里有几个明显错误:
- 函数名应该是
values而非keys,避免语义混淆; map的回调函数参数中,第二个参数是数组索引,不是对象的值;map会自动生成并返回新数组,不需要手动往values里push,只需在回调中返回目标值即可。
修正后的代码:
function values(json) { var obj = JSON.parse(json); // 先通过Object.keys拿到所有键名,再用map遍历每个键,返回对应的value return Object.keys(obj).map(key => obj[key]); }
简单说下map的用法:它会遍历目标数组(这里是Object.keys(obj)返回的键名数组),对每个元素执行回调函数,把回调的返回值收集起来形成新数组。所以这里只要返回obj[key],就能得到所有值组成的数组。
额外提醒
for...in会遍历对象原型链上的可枚举属性,如果只想要对象自身的属性,可以加个判断:
for (const key in obj) { if (obj.hasOwnProperty(key)) { result.push(obj[key]); } }
如果是JSON解析出来的普通对象(没有自定义原型),这个判断可以省略。
内容的提问来源于stack exchange,提问作者tabrown76
相关产品推荐
相关产品推荐

