javascript - 以对象为初始值的数组减少
问题描述
任何人都可以在下面的示例中解释reduce
函数发生了什么,我有一个带有键和空数组的对象作为reduce
方法的初始值,我想在 reduce 方法中逐步解释
initExercises = {
shoulders: [],
chest: [],
arms: [],
back: [],
legs: []
}
exercises = [
{
id: "overhead-press",
title: "Overhead Press",
description: "Delts exercise...",
muscles: "shoulders"
},
{
id: "dips",
title: "Dips",
description: "Triceps exercise...",
muscles: "arms"
},
{
id: "barbell-curls",
title: "Barbell Curls",
description: "Biceps exercise...",
muscles: "arms"
},
{
id: "bench-press",
title: "Bench Press",
description: "Chest exercise...",
muscles: "chest"
},
{
id: "pull-ups",
title: "Pull Ups",
description: "Back and biceps exercise...",
muscles: "back"
},
{
id: "deadlifts",
title: "Deadlifts",
description: "Back and leg exercise...",
muscles: "back"
},
{
id: "squats",
title: "Squats",
description: "Legs exercise...",
muscles: "legs"
}
];
console.log(
exercises.reduce((acc, curr) => {
const {
muscles
} = curr;
acc[muscles] = [...acc[muscles], curr] //what's happening here?
return acc;
}, initExercises)
)
解决方案
你的reduce
功能解释:
exercises.reduce((acc, curr)=>{ /*...*/ }, initExercises)
...将要...
- 放入,放入
initExercises
_acc
exercises[0]
curr
- 然后将前一次迭代的返回值放入
acc
并将当前元素放入curr
- 最后,它返回最后一次迭代的返回值。
这个片段:
const {
muscles
} = curr;
muscles
...从对象curr
(它是数组的一个元素)中提取属性exercises
到常量muscles
。
然后,这个:
acc[muscles] = [...acc[muscles], curr]
...创建一个新数组,将相同肌肉的前一个数组(位于由(刚刚解构的)变量指向的 umulator 对象的属性 中)传播(...
语法)到其中,并在末尾附加 ent 对象;最后用该新数组替换(由 指向的属性)中的旧数组。acc
muscles
curr
acc[muscles]
muscles
最后,它return
是acc
umulator,为下一次迭代保留它。
因此该函数返回一个对象,其中数组的元素按其muscles
属性分组。
详细迭代:
# | acc | curr | muscles | [...acc[muscles], curr] | return value
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 | initExercises | {id: "overhead-press", ... } | "shoulders" | [{id: "overhead-press", ... }] | {shoulders: [{id: "overhead-press", ... }], chest: [], arms: [], back: [], legs: []}
1 | return of #0 | {id: "dips", ... } | "arms" | [{id: "dips", ... }] | {shoulders: [{id: "overhead-press", ... }], chest: [], arms: [{id: "dips", ... }], back: [], legs: []}
2 | return of #1 | {id: "barbell-curls", ... } | "arms" | [{id: "dips", ... }, {id: "barbell-curls", ... }] | {shoulders: [{id: "overhead-press", ... }], chest: [], arms: [{id: "dips", ... }, {id: "barbell-curls", ... }], back: [], legs: []}
...
推荐阅读
- docker - Docker:将文件从容器写入主机上的卷
- neo4j - Neo4j 从图中获取嵌套对象数组的响应
- elixir - 为什么 Ecto.Repo 进程不需要`send/receive`?
- javascript - 如何在nestjs中使用自定义类文件维护nestjs的规则
- file - NetSuite:读取文件柜中的csv类型文件时出现乱码
- gcc - 使用 ARM GCC 时,什么是“nosys”、“nano”、“rdimon”术语?
- machine-learning - 确定梯度下降的起点
- c - .pxd 文件中的 Cython 构造函数重载错误:工厂函数的“C 方法的自参数与父类型不匹配”
- python-3.x - Pandas 跨行的最小值和最大值
- java - Android:如何在 MapBox 中添加自定义标记?