问题描述
我正在尝试将一种方法转换为通用方法,以与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。