Я хочу найти последовательность строк с помощью rxjs

Я хочу найти последовательность строк с помощью rxjs

Например

Целевая строка: 01234010

Строка соответствия: 01

ответ = 2

У меня есть решение с использованием javascript

let index = 0;
while (true) {
  let foundIndex = targetSequence.indexOf(matchSequence, index);
  if (foundIndex == -1) break;

  index = foundIndex + 1;
}

но проблема в том, что я должен использовать rxjs с этим скелетным кодом

import { from, Observable } from "rxjs";
const targetSequence = `01234010`;
const matchSequence = "01";

const _target = from(targetSequence);
const _output: Observable<number> = _target.pipe(
  // here is your code
);

_output.subscribe({
    next: val => console.log(`count : ${val}`)
  });

у вас есть идеи?


person Sungwon WI    schedule 22.02.2021    source источник


Ответы (1)


Для этого вы можете использовать оператор rxJS map.

E.g.

const targetSequence = '01234010';
const matchSequence = '01';

const _target = of(targetSequence);
const _output = _target.pipe(
  map((val) => {
    let foundIndex = val.indexOf(matchSequence);
    return foundIndex + matchSequence.length;
  })
);

_output.subscribe({next: (val) => console.log(val)})

Примечание. Я использовал метод of для создания наблюдаемого объекта, используя from для каждого символа. Я также немного изменил ваш метод поиска результата, но я думаю, что он достигает того, чего вы хотите.

person Rob Bailey    schedule 22.02.2021
comment
есть ли способ решить эту проблему, используя «из», а не «из», которое вы отредактировали? - person Sungwon WI; 22.02.2021
comment
Существует, но это не идеально, вам нужно добавить дополнительного оператора в канал, чтобы объединить выбросы обратно в строку. Поэтому добавление reduce((acc, val) => acc + val) до того, как карта заработает при использовании from. - person Rob Bailey; 22.02.2021
comment
эй, Роб, я думал, что твой ответ правильный, но я хотел подсчитать, сколько последовательностей совпадений появляется в целевой последовательности :) лол ... Т_Т, но я ценю твой ответ - person Sungwon WI; 22.02.2021