JavaScript 提取对象数组name属性生成全0值计数器对象的实现问题
问题根源
- 方法选型不匹配:
map的原生设计逻辑是遍历数组时,为每一个元素生成对应的映射值,最终返回和原数组长度完全一致的新数组。你每轮遍历返回一个独立的单键对象,最终得到单键对象组成的数组是map的正常输出,和你需要的单计数器对象的目标结构从设计上就不匹配。 - 语法书写疏漏:你写的
objectArray((elem) => {...})是直接把数组当函数调用,正确的map调用需要显式加上.map方法名,即objectArray.map((elem) => {...})。
正确实现方式
方案1:使用reduce聚合(最推荐)
这是「数组项转对象键值对」场景的通用适配写法,不需要生成中间数组,遍历过程中直接把所有键值对合并到同一个初始对象里:
const counterObject = objectArray.reduce((acc, curr) => { // 从当前数组项取出name作为键,统一赋值为0,写入累计对象 acc[curr.name] = 0 // 将累计对象返回给下一轮遍历 return acc }, {}) // 累计值的初始值为空对象
方案2:基于原有map逻辑二次合并
如果你不想改动已经写好的map遍历逻辑,只需要把map输出的单键对象数组,通过Object.assign把所有属性合并到同一个空对象即可:
const counterObject = Object.assign( {}, ...objectArray.map(elem => ({[elem.name]: 0})) )
补充说明:你之前得到的结果里出现
Text/Upload/Date/Link这类额外键,是因为你实际运行的objectArray本身就包含这些name值的项,不是代码方法的问题。只要objectArray的内容和你示例中给出的三个对象一致,上面两种方案输出的结果完全匹配你要求的counterObject结构。
内容的提问来源于stack exchange,提问作者Stanciu Patrick
相关产品推荐
相关产品推荐

