如何用一次reduce方法从对象数组生成两个独立数组?
合并两次reduce操作实现宠物主人分类
先补充原代码中缺失的推荐食量计算逻辑(通常宠物推荐食量可通过体重公式推导,这里采用weight^0.75 * 28作为示例),然后通过单次reduce完成两类主人的分类:
const dogs = [ { weight: 22, curFood: 250, owners: ['Alice', 'Bob'] }, { weight: 8, curFood: 200, owners: ['Matilda'] }, { weight: 13, curFood: 275, owners: ['Sarah', 'John'] }, { weight: 32, curFood: 340, owners: ['Michael'] }, ]; // 计算每只狗的推荐食量(公式可根据实际需求调整) dogs.forEach(dog => { dog.recommended = Math.trunc(dog.weight ** 0.75 * 28); }); // 单次reduce实现分类 const [ownersEatTooMuch, ownersEatTooLess] = dogs.reduce(([tooMuch, tooLess], dog) => { const upperLimit = dog.recommended * 1.1; const lowerLimit = dog.recommended * 0.9; if (dog.curFood > upperLimit) { tooMuch.push(...dog.owners); // 直接展开主人数组,避免后续flat() } else if (dog.curFood < lowerLimit) { tooLess.push(...dog.owners); } return [tooMuch, tooLess]; // 返回更新后的累加器 }, [[], []]); console.log(ownersEatTooMuch); // 输出喂食过量的主人列表 console.log(ownersEatTooLess); // 输出喂食不足的主人列表
核心逻辑说明
- 初始值
[[], []]作为累加器,解构后分别对应tooMuch(喂食过量主人数组)和tooLess(喂食不足主人数组) - 使用扩展运算符
...展开dog.owners,直接将单个主人元素添加到目标数组,替代原代码中push后调用flat()的操作,提升效率 - 每次迭代后返回更新后的数组对,作为下一轮循环的累加器
- 提前计算推荐食量的上下阈值,避免重复运算
内容的提问来源于stack exchange,提问作者Zuka Kharati
相关产品推荐
相关产品推荐

