问题
I have the following method that returns result as shown below:
result: [ { status: 200, ... }, { status: 200, ... }, { status: 400, ... }, ... ]
I need to group the result by using status value and return only 2 results instead of 3 for the example result above:
update() {
this.demoService.update(...).toPromise()
.then(result => {
const message = result.map((x: any) => {
if (x.status === 200) {
return {
text: 'successful'
};
} else {
return {
text: 'fail'
};
}
});
}
})
}
I tried to use groupBy
of RxJs but I think it cannot be used in Promise. So, how can I group this result in the example above?
回答1:
I'm not sure it works, but you can try (you filter only entities with distinct status, then select only statuses):
update() {
this.demoService.update(...).subscribe(result => {
const messages = result
.filter((x, i, arr) => arr.findIndex(t => t.status === x.status) === i)
.map(x => x.status);
// do stuff
});
}
回答2:
Create a custom grouping method like this:
var groupBy = (xs, key) => {
return xs.reduce((rv, x) => {
(rv[x[key]] = rv[x[key]] || []).push(x);
return rv;
}, {});
};
console.log(groupBy([{status: 200, foo: 'bar'}, {status: 200, foo: 'baz'}, {status: 400, foo: 'bar'}], 'status'));
Output:
{
"200": [
{
"status": 200,
"foo": "bar"
},
{
"status": 200,
"foo": "baz"
}
],
"400": [
{
"status": 400,
"foo": "bar"
}
]
}
来源:https://stackoverflow.com/questions/66222207/how-to-merge-or-groupby-topromise-via-rxjs