【发布时间】:2020-09-02 11:19:44
【问题描述】:
我尝试使用自己的 map 方法创建 Person 类,我称之为 mapper。要求是使用reduce方法并向mapper发送回调。
class Person {
constructor(name, age, job) {
this.name = name
this.age = age
this.job = job
}
mapper(cb) {
return Object.entries(this).reduce((acc, item) => {
acc = cb(item)
return acc
}, {})
}
}
我创建了这个类的实例。
const kate = new Person('Kate', 34, 'dev')
const result = kate.mapper(([key, val]) => (val === 34 ? { [key]: val } : {}))
console.log(result)
// {}
我应该得到我的结果
// {age: 34}
问题是因为 acc 等于最后一个条件(与作业比较时)。 似乎 acc 在迭代过程中不断被覆盖。 我尝试使用映射器方法中的 forEach 查找来解决该问题,但出现了一些错误。回调应该和现在一样。我知道我应该在映射器中改变某事,但我不知道是什么。我也尝试过使用 Object.assing()。
【问题讨论】:
-
“需求是使用reduce方法...” 那是谁的需求?
reduce很少是合适的工具(具有预定义、经过测试的 reducer 函数的外部函数式编程)。否则,reduce过于复杂且难以阅读。 -
map有什么问题?为什么你只是以一种过于迟钝的方式重新发明轮子? -
您的
.reduce()回调始终返回cb(item)的返回值。所以.mapper()的最终结果是最后一个cb(item)调用的返回值,它将是一个空数组——除非age属性以某种方式成为数组中的最后一个元素并且值为34 -
@T.J.Crowder 我刚从老师那里得到练习。可能,原因是要研究一种更难的方法来解决这个问题。如果我只能使用地图,我不会写这篇文章......
-
我认为是这样的。 :-) 听起来你的老师已经感染了“这是一个数组的东西,我想我应该使用
reduce”错误。 FWIW:twitter.com/bterlson/status/1099010861065068544, twitter.com/jaffathecake/status/1213077702300852224 编码快乐!
标签: javascript class object