【问题标题】:How to map object using reduce method?如何使用reduce方法映射对象?
【发布时间】:2020-09-02 11:19:44
【问题描述】:

我尝试使用自己的 ma​​p 方法创建 Person 类,我称之为 ma​​pper。要求是使用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


【解决方案1】:

似乎 acc 在迭代过程中不断被覆盖。

没错,因为您从cb 获得了一个新对象,然后您返回了该对象。

如果要合并cb返回的对象,可以改成使用Object.assigncb返回的对象的属性复制到acc上:

mapper(cb) {
  return Object.entries(this).reduce((acc, item) => {
    Object.assign(acc, cb(item)); // ***
    return acc;
  }, {});
}

...但实际上,reduce 不是在这里使用的工具;累加器永远不会改变(我们只是修改它)。不过,你说这是要求……

你也可以组合

    Object.assign(acc, cb(item)); // ***
    return acc;

进入

    return Object.assign(acc, cb(item)); // ***

因为Object.assign 返回它的第一个参数(acc,在上面)。

【讨论】:

  • 非常感谢!有用。正如我所提到的,我尝试过使用 Object.assign(),但我发现它比你更复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多