箭头函数中如何平推async/await返回的数组对象至目标数组?
解决数组嵌套与循环不生效的问题
为什么会出现嵌套数组?
你用results.push(val)的时候,val本身就是一个包含多个对象的数组,push方法会把整个数组当作单个元素塞进results里,自然就变成了嵌套数组[ [obj1, obj2] ],而不是你想要的顶层对象数组。
为什么你的for in循环没生效?
箭头函数里如果是多行代码,必须用{}把代码块包裹起来,你之前的写法缺少大括号,JavaScript会直接解析错误,循环根本没执行。另外for in其实不适合遍历数组(它会遍历对象的所有可枚举属性,包括原型链上的),更推荐用for of或者数组原生方法。
几种可行的解决方案
1. 扩展运算符(最简洁)
用扩展运算符把val里的元素逐个展开,一次性push到results里:
results = []; search(input).then(val => results.push(...val));
...val会把数组val拆成单个元素,相当于results.push(val[0], val[1], ...),完美避免嵌套。
2. 数组concat方法
如果不想修改原results数组(不过你这里已经先清空了),可以用concat合并数组:
results = []; search(input).then(val => results = results.concat(val));
concat会返回新数组,把空数组和val的所有元素合并,结果就是你要的顶层对象数组。
3. 修复循环写法(适合需要额外处理元素的场景)
如果需要在循环里对每个对象做额外操作,用for of更安全:
results = []; search(input).then(val => { // 遍历val里的每个对象 for (const item of val) { // 这里可以加额外逻辑,比如过滤、修改属性 results.push(item); } });
要是一定要用for in,记得加大括号和属性判断:
results = []; search(input).then(val => { for (const i in val) { // 确保只处理数组自身的索引属性 if (val.hasOwnProperty(i)) { results.push(val[i]); } } });
4. 用async/await简化代码(更优雅)
既然search是async函数,直接用await写会更易读:
async function fetchResults(input) { const results = []; const val = await search(input); results.push(...val); // 或者直接写成 const results = [...val]; 如果你不需要保留原有数组内容 return results; } // 调用方式 fetchResults(input);
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

