我在Typescript中寻找一个'groupBy'方法,但它似乎仍然不是本地实现的。
赞:
const grouping = items.groupBy('propValue');
分组对象应该是{key:string,values:any []}
之类的对象的集合答案 0 :(得分:0)
经过研究,我找到了解决方案:
https://gist.github.com/guillaumegarcia13/668518119667594fdca150ebefecd194
无论如何,我将其结构化得更多一些,以实现更好的打字效果。
以下原型支持嵌套属性和可选的回调参数,以计算对元素的某些操作。
/**
* GroupBy array extension
*/
interface Grouping<T> {
key: string,
values: Array<T>,
computed: any
}
interface Array<T> {
groupBy(prop: T, opCallBack: (group: Grouping<T>, item: T) => any): Grouping<T>[];
}
// Nested property support
function getVal(obj, prop) {
const props = prop.split('.');
if (props.length === 1) {
return obj[prop];
} else {
return getVal(obj[props[0]], prop.slice(prop.indexOf('.') + 1, prop.length));
}
}
if (!Array.prototype.groupBy) {
// Return an array of 'Grouping' object
Array.prototype.groupBy = function (prop: string, opCallBack: (group: Grouping<any>, item: any) => any = null) {
return this.reduce((data, item) => {
// Get value
const val = getVal(item, prop);
// Search val
if (data.filter(g => g.key === val).length === 0) {
data.push({
key: val,
values: []
});
}
if(opCallBack) {
opCallBack(data.find(g => g.key === val), item);
}
data.find(g => g.key === val).values.push(item);
return data;
}, []);
}
}
/* End */
一个例子:
var a = [{a: 'aa', b: 45}, {a: 'aa', b: 45}, {a: 'aa', b: 2}, {a: 'cc', b: 4}, {a: 'cc', b: 45.6}, {a: 'bb', b: 1}];
console.log(a.groupBy('a', (group, item) => {
group.computed = group.computed || 0; group.computed += item.b
}));
// Log:
[
{
"key": "aa",
"values": [
{
"a": "aa",
"b": 45
},
{
"a": "aa",
"b": 45
},
{
"a": "aa",
"b": 2
}
],
"computed": 92
},
{
"key": "cc",
"values": [
{
"a": "cc",
"b": 4
},
{
"a": "cc",
"b": 45.6
}
],
"computed": 49.6
},
{
"key": "bb",
"values": [
{
"a": "bb",
"b": 1
}
],
"computed": 1
}
]
我希望它会有用
答案 1 :(得分:0)
默认情况下可能不是内置的,但是存在一个项目,可将类似于linq的函数带入打字稿。我建议您看看this BitBucket API上的linqts项目,以防您想使用LINQ已知的其他方法。