javascript - როგორ გავაერთიანოთ ან გავგროვოთ toPromise RxJs-ის საშუალებით?


მე მაქვს შემდეგი მეთოდი, რომელიც აბრუნებს შედეგს, როგორც ნაჩვენებია ქვემოთ:

result: [ { status: 200, ... }, { status: 200, ... }, { status: 400, ... }, ... ]
    

მე უნდა გავაერთიანო შედეგი სტატუსის ღირებულების გამოყენებით და ვიმუშაო მხოლოდ 2 შედეგზე 3-ის ნაცვლად, მაგალითად ზედა შედეგისთვის:

update() {
  this.demoService.update(...).toPromise()
  .then(result => {

    const message = result.map((x: any) => {
      if (x.status === 200) {
        return {
          text: 'successful'
        };
      } else {
        return {
          text: 'fail'
        };
      }
    });

    }
  })
}

ვცადე RxJs-ის groupBy-ის გამოყენება, მაგრამ ვგულით, რომ იგი ვერ გამოვიყენება Promise-ში. მაშ, როგორ შემიძლია შევკრიბო ეს შედეგი ზემოთ მოყვანილ მაგალითში?

პასუხი #1

არ ვარ დარწმუნებული, ეს მუშაობს თუ არა, მაგრამ თქვენ შეგიძლიათ სცადოთ (თქვენ ფილტრავთ მხოლოდ სუბიექტებს მნიშვნილის უნიკალური სტატუსით, შემდეგ აირჩევთ მხოლოდ სტატუსებს):

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

შექმნით კასტომიზებულ ჯგუფირების მეთოდს ასეთს:

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'));

გამონაკლისი :

{
    "200": [
        {
            "status": 200,
            "foo": "bar"
        },
        {
            "status": 200,
            "foo": "baz"
        }
    ],
    "400": [
        {
            "status": 400,
            "foo": "bar"
        }
    ]
}