同一变量显示不同值排查:JS中receivedOrderKey结果异常
问题分析:为什么
receivedOrderKey全是undefined? 我来帮你揪出问题所在~你这段代码里藏了一个很容易踩的小坑:
你先声明了var receivedOrderKey = [];,但紧接着又用var receivedOrderKey = Object.keys(columnsDataList).map(...)重新赋值了这个变量!
map方法的特性是会返回一个新数组,数组长度和原数组完全一致,每个元素对应回调函数的返回值。你的回调函数里,只有当值不为null时才执行push操作,但回调函数本身没有返回任何内容(默认返回undefined)。所以map遍历原对象的5个键时,每次迭代都返回undefined,最后这个满是undefined的新数组就覆盖了你之前初始化的空数组——这就是console.log显示5个undefined的原因。
修复方法有两种,看你偏好哪种:
方法1:改用forEach(贴合你原本的写法逻辑)
把map换成forEach就好,因为forEach只负责遍历执行回调,不会返回新数组,也就不会覆盖你初始化的数组:
var columnsDataList = { "checkbox": null, "status": "status3", "invoiceId": null, "invoiceDate": "invoiceDate6", "type": "type4" }; console.log(columnsDataList); var receivedOrderKey = []; Object.keys(columnsDataList).forEach(function(key) { var checkNull = columnsDataList[key]; if (checkNull != null) { receivedOrderKey.push(key); console.log(receivedOrderKey) } }); console.log("it's coming blank here", receivedOrderKey); // 输出:["status", "invoiceDate", "type"]
方法2:用filter更简洁(推荐)
既然你要过滤出值不为null的键,直接用filter一步到位,不需要额外的push操作:
var columnsDataList = { "checkbox": null, "status": "status3", "invoiceId": null, "invoiceDate": "invoiceDate6", "type": "type4" }; console.log(columnsDataList); var receivedOrderKey = Object.keys(columnsDataList).filter(function(key) { return columnsDataList[key] != null; }); console.log("it's coming blank here", receivedOrderKey); // 输出:["status", "invoiceDate", "type"]
这样就能得到你预期的非null键数组啦~
内容的提问来源于stack exchange,提问作者Nightshade
相关产品推荐
相关产品推荐

