如何将MongoDB查询结果赋值给全局数组本身而非其内部元素?
如何高效将MongoDB查询结果赋值给全局数组?
你的问题其实踩中了JavaScript里一个很常见的坑——值传递与引用传递的区别,先给你直接上可行的解决方案,再给你拆解原因:
解决方案:直接通过属性名操作global对象
既然你已经有了存储全局变量名的colsArray,完全可以利用对象的动态属性访问语法,循环给global的对应属性赋值,不用一个个硬编码:
var colsArray = ["array1","array2","array3"]; var promises = colsArray.map(col => global.fetchCollection(col)); Promise.all(promises).then(responses => { // 用forEach循环更简洁直观 responses.forEach((result, idx) => { global[colsArray[idx]] = result; }); console.log("VALUE OF global.array1: " + global.array1); console.log("VALUE OF global.array2: " + global.array2); })
如果习惯用for循环,效果是一样的:
var colsArray = ["array1","array2","array3"]; var promises = colsArray.map(col => global.fetchCollection(col)); Promise.all(promises).then(responses => { for (let d = 0; d < responses.length; d++) { global[colsArray[d]] = responses[d]; } })
为什么你之前的方法不行?
你最初尝试的var arrays = [global.array1, global.array2, global.array3];,核心问题在这里:
- 因为
global.array1初始值是undefined(属于JavaScript的原始值类型),当你把它放进arrays数组时,存储的是这个值的副本,而不是指向global.array1的引用。 - 所以你后续执行
arrays[d] = responses[d],只是修改了arrays数组自身的元素,和global对象上的array1/array2/array3没有任何关联,自然看不到全局变量的变化。
而你最后尝试的arrays[colsArray[d]] = responses[d],本质是在给arrays这个普通数组添加属性(比如arrays["array1"]),同样没有操作到global对象,所以也不会生效。
补充说明
你提到的“可行但不够理想”的硬编码方式,其实就是直接操作global对象的属性,我们的方案只是把这种硬编码改成了循环——既保留了可行性,又提升了代码的可维护性:以后要加更多全局数组,只需要在colsArray里添加对应的名字就行,不用修改循环逻辑。
内容的提问来源于stack exchange,提问作者TheProgrammer
相关产品推荐
相关产品推荐

