使用Lodash reduce获取所有sections的guideScenes仅返回首个的解决问询
解决方法
首先得说,你当前代码的问题出在累积值的类型和处理方式上——如果你的guideScenes是数组的话,用对象作为_.reduce的初始值,再通过对象展开来合并,会把数组的索引当成对象的键,后续section的数组会覆盖掉前面的索引键,最终要么只留下最后一个section的内容,要么出现不符合预期的键值对,这显然不是你想要的“获取全部guideScenes列表”的效果。
下面分两种常见场景给你修改方案:
场景1:你的guideScenes是数组(想要合并成一个大数组)
这是最符合“列表”描述的情况,把初始累积值改成空数组,每次将当前section的guideScenes数组展开进去就行:
let combinedScenes = _.reduce(sections, (prev, section) => { return [...prev, ...section.guideScenes]; }, []); // 关键:初始值从{}改成空数组
如果你想用更简洁的Lodash原生方法,直接用_.flatMap一步到位:
let combinedScenes = _.flatMap(sections, 'guideScenes');
它会自动遍历每个section,提取guideScenes数组并扁平化合并,代码更清爽。
场景2:你的guideScenes是对象(想要合并所有键值对)
如果你的guideScenes是键值对形式的对象,原代码逻辑本身是对的,但如果只返回第一个section的内容,大概率是后面的section里guideScenes为空或者undefined。可以加个判断过滤无效数据:
let combinedScenes = _.reduce(sections, (prev, section) => { // 跳过guideScenes不存在或为空的section if (!section.guideScenes || Object.keys(section.guideScenes).length === 0) { return prev; } return {...prev, ...section.guideScenes}; }, {});
这种写法会把所有section的guideScenes对象合并,后续对象的重复键会覆盖前面的(这是对象合并的默认规则)。
内容的提问来源于stack exchange,提问作者beek
相关产品推荐
相关产品推荐

