Typescript e6中的Array.groupBy可与箭头功能一起使用

问题描述

我正在尝试将一种方法转换为通用方法,以与JavaScript中的箭头功能一起使用,但是以某种方式无法确定我应该如何转换它。 groupBy: <Map>(predicate: (item: T) => Map[]) => Map[];

Array.prototype.groupBy = function (predicate) {
return this.reduce(
    (entryMap,e) => entryMap.set(e.status,[...entryMap.get(e.status) || [],e]),new Map()
)};

我在此方法中收到的谓词就像ƒ (x) { return x.status; }

我想将此e.status替换为一些通用名称,以便像arrayData.groupBy(x=>x.status)一样使用它。 作为一个初学者,我不知道该怎么做。 我在@Arthur Tacca发表的帖子https://stackoverflow.com/a/47752730/5001462中找到了方法

预先感谢

解决方法

链接的问题中的代码正在根据e.status对对象进行分组。但是,在您的情况下,该属性是动态的。如果您将x => x.status作为谓词参数传递,如何为e.status中的每个对象获取reduce?您只需要使用predicate参数调用e。因此,将所有e.status替换为predicate(e)

Array.prototype.groupBy = function(predicate) {
  return this.reduce(
    (entryMap,e) => entryMap.set(predicate(e),[...entryMap.get(predicate(e)) || [],e]),new Map()
  )
};

const arr = [{ status: 10,id: 1 },{ status: 10,id: 2 },{ status:20,id: 3 }],map = arr.groupBy(e => e.status)

console.log(map.get(10))
console.log(map.get(20))
console.log(map.get(30))

请注意,extending native objects a bad practice。即使您将新项目添加到原型中,也请确保使用Object.defineProperty进行添加,如下所示:

Object.defineProperty(Array.prototype,"groupBy",{
  value: function(predicate) {
    return this.reduce(
      (entryMap,new Map()
    )
  },configurable: true,writable: true
});

如果以此方式定义,则enumerable将设置为false。如果直接添加Array.prototype.groupBy = function(predicate){},则enumerable将设置为true,它将show up in for..in loops