尝试生成对象数组时旧值被覆盖,请求排查JavaScript代码问题
问题分析与修复方案
嘿,我来帮你拆解下代码里的问题,以及怎么修正才能得到你想要的对象数组~
核心错误点
- 对象键重复覆盖:你用
query = {...query, value};时,每次都是把名为value的键塞进对象里,但对象的键是唯一的,所以每一轮迭代都会覆盖掉之前的value键,最后query只会保留最后一次生成的对象。 - 混淆数组与对象操作:你初始化
query是空数组,却用对象展开语法(...)来合并数据,完全搞错了数据类型——你想要的是数组,却一直在操作对象。 - 浪费了
map的特性:map方法的本质是返回一个新数组,每个元素是回调函数的返回值,但你的回调里没有return,所以生成的a数组全是undefined,而且你也没用到这个变量。
修复后的代码
最简洁的方式就是直接用map生成目标数组,毕竟map天生就是用来转换数组元素的:
let abText = (text) => { const query = text.map(script => createFromMethod(script)); console.log(query); return query; };
如果需要在迭代时加额外逻辑,也可以用reduce来累加数组:
let abText = (text) => { const query = text.reduce((acc, script) => { // 这里可以加额外处理逻辑 acc.push(createFromMethod(script)); return acc; }, []); // 初始值设为空数组 console.log(query); return query; };
为什么这样能解决问题
- 第一个方案里,
map会自动遍历text的每个元素,把每个script转换成createFromMethod返回的对象,最后把这些对象打包成新数组,完全匹配你的需求。 - 第二个方案里,
reduce从空数组开始,每轮迭代把新生成的对象push到累加器里,最后返回完整的对象数组,不会出现覆盖问题。
内容的提问来源于stack exchange,提问作者Lara
相关产品推荐
相关产品推荐

